acegi控制并发httpsession
在一些应用场合,企业可能需要限制同一账号在同一时间登录到同一web应用的次数,即并发控制httpsession数量。比如同一时间只允许admin/password用户在服务区端存在一个或若干个活动的httpsession。
acegi内置了这一并发控制的支持,要使用这一支持,需要完成以下步骤:
1、在acegi的配置文件中做如下配置:
<bean id="concurrentSessionFilter" class="org.acegisecurity.concurrent.ConcurrentSessionFilter">
<property name="sessionRegistry" ref="sessionRegistry" />
<property name="expiredUrl"><value>/hello.html</value></property>
<bean>
<bean id="sessionRegistry" class="org.acegisecurity.concurrent.SessionRegistryImpl" />
此外,别忘了将配置的concurrentSessionFilter过滤器添加到过滤器链中
2、一旦认证管理器成功认证了authentication请求,providerManager会立即调用conurrentSessionController验证当前用用户登录信息。
所以要在acegi配置文件中添加如下配置:
<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
...
<property name="sessionController" ref="concurrentSessionController">
</bean>
<bean id="concurrentSessionController" class="org.acegisecurity.concurrent.ConcurrentSessionControllerImpl">
<property name="maximumSession" value="1" /> <!--表示允许用户创建的最大并发session -->
<property name="sessionRegistry" ref="sessionRegistry" />
<property name="exceptionIfMaximumExceeded" value="false" /><!-- 表示并发数量已达到后是否抛出异常-->
在实际应用中,开发者往往会将exceptionIfMaximumExceeded属性设置为false,这也是较好的做法,这是因为很多浏览器用户往往不会显示退出已登录的web应用,而是直接将浏览器关闭。
3、在web.xml文件中配置如下监听器:
<listener>
<listener-class>org.acegisecurity.ui.session.HttpSessionEventPublisher</listener-class>
<listener>
通过上述过程我们即启用了httpsession并发控制。