- 浏览: 9769 次
最新评论
今天就讲个ConcurrentSessionFilter。
在Acegi 1.x版本中,控制并发HttpSession和Remember-Me认证服务不能够同时启用,它们之间存在冲突问题,这是该版本的一个Bug,希望他们尽快改进!!关于这方面的资料,网上很多有说,不明白的朋友可以去了解了解。
在一些应用场合,企业可能需要限制同一帐号在同一时间登录到同一Web应用的次数,即控制并发HttpSession的数量。比如,在同一时间,只允许javaee/password用户在服务器存在一个或若干个活动HttpSession。Acegi内置了HttpSession的并发控制支持,为我们提供了方便。为了启用这一企业特性,开发者必须完成如下几方面的配置。
1、将concurrentSessionFilter添加到filterChainProxy中
Xml代码 收藏代码
2、配置ConcurrentSessionFilter
控制并发HttpSession的过滤器,concurrentSessionFilter暴露了sessionRegistry和expiredUrl属性,sessionRegistry引用一个HttpSession注册器,这一注册器动态维护了登录到这一Web应用的所有HttpSession信息。
ConcurrentSessionFilter起到两个作用:
第一、对每个请求, 它都会调用org.acegisecurity.concurrent.SessionRegistry.refreshLastRequest(String)方法,这样保证所有已注册的会话总是有正确的最后修改时间。
第二、它会从SessionRegistry为每个请求返回org.acegisecurity.concurrent.SessionInformation会话信息,并且检查session是否已标记为过期。如果已标记为过期,那么该session将会被invalidate()掉。
Xml代码 收藏代码
<!-- 注意,我们的程序一般并不用直接与SessionRegistryImpl打交道,你只需在Spring的配置文件定义一个Bean就行了 -->
3、配置HttpSessionEventPublisher
SessionRegistry的实现类是SessionRegistryImpl,SessionRegistryImpl实现了ApplicationListener,而且它会负责应对HttpSessionDestroyedEvent事件。一旦SessionRegistryImpl接收到HttpSessionDestroyedEvent事件,则它会把触发这一事件的HttpSession的相关信息从当前注册器中清除掉。因此,HttpSessionEventPublisher的配置工作显得格外重要。在web.xml中添加
Xml代码 收藏代码
(个人发现,如果不添加这个listener,仍然能实现并发控制,很奇怪。清楚这方面的朋友就回复教教我,谢谢!)
4、配置concurrentSessionController
并发HttpSession控制器, concurrentSessionController只需要一个sessionRegistry实例的属性,但它应用时还使用了maximumSessions属性,把它赋值为1。在ConcurrentSessionControllerImpl的源代码中,这个值初始值其实也是1的
*它的用法和用处是这样的:*
(1)可以给它赋值-1,那么将不会限制并发登录。
(2)可以给它赋大于0值,这个数字限制相同用户名同时成功并发登录同一个web应用的次数。
注意:不可以给它赋值为0,这是不允许的。
例如,如果这个值是3,那么用户名为javaee的用户可以同时在3个地点同时成功登录进web应用,只要密码正确。
maximumSessions:允许用户创建的最大并发HttpSession数量。
exceptionIfMaximumExceeded:一旦并发HttpSession数量超过限额,是否抛出异常。
Xml代码 收藏代码
开发环境:
MyEclipse 5.0GA
Eclipse3.2.1
JDK1.5.0_10
tomcat5.5.23
acegi-security-1.0.7
Spring2.0
Jar包:
acegi-security-1.0.7.jar
Spring.jar
commons-codec.jar
jstl.jar (1.1版)
standard.jar
<!---->
<!---->
在Acegi 1.x版本中,控制并发HttpSession和Remember-Me认证服务不能够同时启用,它们之间存在冲突问题,这是该版本的一个Bug,希望他们尽快改进!!关于这方面的资料,网上很多有说,不明白的朋友可以去了解了解。
在一些应用场合,企业可能需要限制同一帐号在同一时间登录到同一Web应用的次数,即控制并发HttpSession的数量。比如,在同一时间,只允许javaee/password用户在服务器存在一个或若干个活动HttpSession。Acegi内置了HttpSession的并发控制支持,为我们提供了方便。为了启用这一企业特性,开发者必须完成如下几方面的配置。
1、将concurrentSessionFilter添加到filterChainProxy中
Xml代码 收藏代码
<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"> <property name="filterInvocationDefinitionSource"> <value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /**=concurrentSessionFilter,httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor </value> </property> </bean>
2、配置ConcurrentSessionFilter
控制并发HttpSession的过滤器,concurrentSessionFilter暴露了sessionRegistry和expiredUrl属性,sessionRegistry引用一个HttpSession注册器,这一注册器动态维护了登录到这一Web应用的所有HttpSession信息。
ConcurrentSessionFilter起到两个作用:
第一、对每个请求, 它都会调用org.acegisecurity.concurrent.SessionRegistry.refreshLastRequest(String)方法,这样保证所有已注册的会话总是有正确的最后修改时间。
第二、它会从SessionRegistry为每个请求返回org.acegisecurity.concurrent.SessionInformation会话信息,并且检查session是否已标记为过期。如果已标记为过期,那么该session将会被invalidate()掉。
Xml代码 收藏代码
<bean id="concurrentSessionFilter" class="org.acegisecurity.concurrent.ConcurrentSessionFilter"> <!-- 每次HttpSession开始或者结束的时候,web.xml中的HttpSessionEventPublisher都会发布一个 ApplicationEvent事件到Spring的ApplicationContext。这是至关重要的,因为这个机制允许在session结束的时候,SessionRegistryImpl会得到通知。这解释了为什么我们需要在ConcurrentSessionFilter中指向 SessionRegistryImpl的实例。--> <property name="sessionRegistry" ref="sessionRegistry"></property> <!-- 如果concurrentSessionController的exceptionIfMaximumExceeded属性设置为true,那么一旦并发HttpSession数量超过限额,将会重定向到expiredUrl指定的路径 --> <property name="expiredUrl"> <value>/concurrentError.jsp</value> </property> </bean>
<!-- 注意,我们的程序一般并不用直接与SessionRegistryImpl打交道,你只需在Spring的配置文件定义一个Bean就行了 -->
<bean id="sessionRegistry" class="org.acegisecurity.concurrent.SessionRegistryImpl"> </bean>
3、配置HttpSessionEventPublisher
SessionRegistry的实现类是SessionRegistryImpl,SessionRegistryImpl实现了ApplicationListener,而且它会负责应对HttpSessionDestroyedEvent事件。一旦SessionRegistryImpl接收到HttpSessionDestroyedEvent事件,则它会把触发这一事件的HttpSession的相关信息从当前注册器中清除掉。因此,HttpSessionEventPublisher的配置工作显得格外重要。在web.xml中添加
Xml代码 收藏代码
<listener> <listener-class> org.acegisecurity.ui.session.HttpSessionEventPublisher </listener-class> </listener>
(个人发现,如果不添加这个listener,仍然能实现并发控制,很奇怪。清楚这方面的朋友就回复教教我,谢谢!)
4、配置concurrentSessionController
并发HttpSession控制器, concurrentSessionController只需要一个sessionRegistry实例的属性,但它应用时还使用了maximumSessions属性,把它赋值为1。在ConcurrentSessionControllerImpl的源代码中,这个值初始值其实也是1的
*它的用法和用处是这样的:*
(1)可以给它赋值-1,那么将不会限制并发登录。
(2)可以给它赋大于0值,这个数字限制相同用户名同时成功并发登录同一个web应用的次数。
注意:不可以给它赋值为0,这是不允许的。
例如,如果这个值是3,那么用户名为javaee的用户可以同时在3个地点同时成功登录进web应用,只要密码正确。
maximumSessions:允许用户创建的最大并发HttpSession数量。
exceptionIfMaximumExceeded:一旦并发HttpSession数量超过限额,是否抛出异常。
Xml代码 收藏代码
<bean id="concurrentSessionController" class="org.acegisecurity.concurrent.ConcurrentSessionControllerImpl"> <property name="maximumSessions" value="1"></property> <property name="sessionRegistry" ref="sessionRegistry"></property> <!-- 一般设置为false. 为true时, 如果已有一个该用户登录了, 那么在另一个地方登录该用户将抛出异常 如果设置为false, 那么, 如果已有一个该用户登录了系统, 那么在另一个地方也可以登录, 登录后前者会被逼退出系统 --> <property name="exceptionIfMaximumExceeded" value="true"></property> </bean> <!--一旦认证管理器成功认证了Authentication请求,ProviderManager会立即调用concurrentSessionController验证当前用户的已登录信息。--> <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"> …… <!-- 增加 --> <property name="sessionController" ref="concurrentSessionController"> </property> </bean>
开发环境:
MyEclipse 5.0GA
Eclipse3.2.1
JDK1.5.0_10
tomcat5.5.23
acegi-security-1.0.7
Spring2.0
Jar包:
acegi-security-1.0.7.jar
Spring.jar
commons-codec.jar
jstl.jar (1.1版)
standard.jar
<!---->
<!---->
发表评论
-
SpringSecurity 配置(登陆验证,session失效等等)
2015-09-28 15:44 2738SpringSecurity安全配置—SSH整合 项目中使用 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(7)-缓存用户信息
2015-09-23 18:04 451首先讲讲EhCache。在默认情况下,即在用户未提供自身配置文 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(6)
2015-09-22 16:19 398在企业应用中,用户的用户名、密码和角色等信息一般存放在RDBM ... -
菜鸟-手把手教你把Acegi应用到实际项目中(5)
2015-09-22 16:18 440在实际企业应用中,用户密码一般都会进行加密处理,这样才能使企业 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(3)
2015-09-22 09:43 452这一节我们将要了解的是AnonymousProcessi ... -
菜鸟-手把手教你把Acegi应用到实际项目中(1.2)
2015-09-22 09:29 479菜鸟-手把手教你把Acegi应用到实际项目中(1.2) 博客 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(1.1)
2015-09-21 16:37 434菜鸟-手把手教你把Acegi应用到实际项目中(1.1) 博客 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(2)
2015-09-21 16:28 499菜鸟-手把手教你把Acegi应用到实际项目中(2) 博客分类 ... -
使用ACEGI搭建权限系统
2015-09-21 16:25 418使用ACEGI搭建权限系统:第三部分 三使用CAS实现单点登 ... -
acegi安全框架使用
2015-09-21 16:20 438acegi安全框架使用:第二部分 二、dbms实现鉴权 1. ... -
使用ACEGI实现权限控制
2015-09-21 16:10 517使用ACEGI实现权限控制,第一部分 环境: struts ...
相关推荐
在“菜鸟-手把手教你把Acegi应用到实际项目中(3)”这篇博文中,博主可能会深入讲解如何将 Acegi 集成到实际的项目中,为读者提供一个逐步的指南。下面,我们将探讨 Acegi 的核心概念、配置以及在项目中的应用。 1. ...
本教程将引导初学者逐步了解如何在实际项目中应用Acegi安全框架,以便为你的Web应用提供强大的身份验证和授权功能。 首先,让我们理解Acegi的基础概念。Acegi的核心组件包括SecurityContext、Authentication和...
在本文中,我们将深入理解如何将Acegi应用到实际项目中,特别关注其核心配置——web.xml中的过滤器设置和Acegi安全文件的配置。 首先,我们来看web.xml中的过滤器配置: 1. **FilterToBeanProxy**:Acegi通过...
在使用这个压缩包时,首先需要将其解压,然后将`acegi-security-tiger-1.0.0-RC2.jar`添加到项目的类路径中。如果项目是基于Spring的,需要在配置文件中启用Acegi Security,并根据应用需求配置相应的安全策略。同时...
包含acegi-security-1.0.7.jar,acegi-security-1.0.7-sources.jar,acegi-security-cas-1.0.7.jar,acegi-security-cas-1.0.7-sources.jar,acegi-security-catalina-1.0.7.jar,acegi-security-catalina-1.0.7-...
这个"acegi-sample.rar_acegi"项目提供了一个详细的示例,帮助开发者理解并应用Acegi框架的核心功能。下面我们将深入探讨Acegi的主要特性及其在实际开发中的应用。 1. **认证与授权**: Acegi框架的核心是它对用户...
通过学习Acegi,我们可以了解到Web应用安全的基本思路和实践方法,这对于理解现代的Spring Security框架非常有帮助。虽然Acegi已经不再更新,但它的理念和架构仍对现代安全框架设计产生深远影响。
acegi-security 1.0.2.jar
Acegi是一个专门为SpringFramework提供安全机制的项目,全称为Acegi Security System for Spring.
这个压缩包中的"acegi-sample"部分可能包含了一个示例项目,展示了如何在实际应用中配置和使用Acegi Security。而"spring-1.2.4.jar"则是Spring框架的一个较旧版本,表明Acegi Security是在Spring 1.x时代设计的,那...
acegi-security-0.8.3驱动程序
在本教程中,作者旨在帮助那些在学习Acegi过程中遇到困难的开发者,通过一步步的指导,使他们能够成功地将Acegi集成到实际项目中,并理解其核心配置和工作原理。 首先,Acegi的配置是其难点之一,因为涉及许多不同...
这篇博客将深入解析一个配置了Acegi Security的`applicationContext-acegi-security.xml`文件,帮助我们理解如何将LDAP与Acegi集成以实现更安全的Web应用。 **LDAP基础** LDAP是一种标准的网络协议,用于存储和...
标题“spring的acegi应用”指的是在Spring框架中使用Acegi安全模块进行权限管理和用户认证的一个主题。Acegi是Spring早期的一个安全组件,后来发展成为Spring Security,是Spring生态系统中的重要部分,用于提供全面...
它在Spring框架的基础上构建了一套完整的安全解决方案,使开发者能够方便地集成到自己的应用中,确保用户访问权限的有效控制和数据安全。 Acegi Security 1.0.7是该组件的一个稳定版本,其核心功能包括身份验证、...
"acegi-security-0.6.1.jar"是Acegi Security的主库文件,包含了所有必要的类和资源,使得开发者能够将安全功能集成到他们的Spring应用中。这个JAR文件可以被添加到应用的类路径中,以便在运行时加载和使用Acegi ...
在实际应用中,开发者可以通过创建自定义的`AuthenticationProvider`实现特定的身份验证逻辑,或者通过扩展`AbstractAccessDecisionManager`来自定义授权策略。此外,还可以利用`FilterSecurityInterceptor`进行URL...