HttpSessionEventPublisher
实现了HttpSessionListener接口,监听session的创建和销毁事件,通过ApplicationContext发布对应的事件HttpSessionCreatedEvent HttpSessionDestroyedEvent //监听session创建事件 public void sessionCreated(HttpSessionEvent event) { HttpSessionCreatedEvent e = new HttpSessionCreatedEvent(event.getSession()); //发布事件 getContext(event.getSession().getServletContext()).publishEvent(e); } //监听session销毁事件 public void sessionDestroyed(HttpSessionEvent event) { HttpSessionDestroyedEvent e = new HttpSessionDestroyedEvent(event.getSession()); //发布事件 getContext(event.getSession().getServletContext()).publishEvent(e); }
SessionRegistry , SessionInformation
SessionInformation :记录认证用户的session信息 。
lastRequest:最后一次访问次数
principal:认证用户信息
sessionId:session的id
expired:是否过期
SessionRegistry :
保存了所有认证成功后用户的SessionInformation信息,每次用户访问服务器的会从sessionRegistry中查询出当前用户的session信息 ,判断是否过期以及刷新最后一次方法时间,默认的实现类SessionRegistryImpl,监听了session的销毁事件,若销毁,那么删除掉session信息,有两个属性:
/** <principal:Object,SessionIdSet> 以认证用户对象做key,多个sessionId 为value 。一个用户可以对应多个不同的session,表示同一个帐号可以同时在不同的浏览器上登录,可以配置最大允许同时登录的数*/ private final ConcurrentMap<Object,Set<String>> principals = new ConcurrentHashMap<Object,Set<String>>(); /** <sessionId:Object,SessionInformation> 以sessionid为key SessionInformation为value */ private final Map<String, SessionInformation> sessionIds = new ConcurrentHashMap<String, SessionInformation>();
SessionAuthenticationStrategy
void onAuthentication(Authentication authentication, HttpServletRequest request, HttpServletResponse response) throws SessionAuthenticationException;
有多个实现类:
ChangeSessionIdAuthenticationStrategy:
调用HttpServletRequest的changeSessionId方法改变sessionid
SessionFixationProtectionStrategy:
首先让原来的session过期,然后创建一个新的session,把原来session的属性拷贝到新的session中
http://xpenxpen.iteye.com/blog/1664075
RegisterSessionAuthenticationStrategy:
用户认证成功后sessionRegistry调用registerNewSession,保存用户的信息和session
ConcurrentSessionControlAuthenticationStrategy:
允许用户同时在线数,有一个maximumSessions属性,默认是1。通过sessionRegistry判断用户数是否已经超过了最大允许数,若超过了,那么就让最近一个的session过期(让上一个用户强制下线)
CompositeSessionAuthenticationStrategy:组合使用多个SessionAuthenticationStrategy
实现控制同时在线用户数
1. 在web.xml中添加listener
<listener> <listener-class> org.springframework.security.web.session.HttpSessionEventPublisher </listener-class> </listener>
2. 在security.xml中添加代码:
<security:http> <security:intercept-url pattern="/**" access="ROLE_USER"/> <security:form-login/> <security:logout logout-url="/logout"/> <security:session-management> <security:concurrency-control max-sessions="1"/> </security:session-management> </security:http>
默认创建的SessionAuthenticationStrategy是组合CompositeSessionAuthenticationStrategy:设置的SessionAuthenticationStrategy有:RegisterSessionAuthenticationStrategy ConcurrentSessionControlAuthenticationStrategy SessionFixationProtectionStrategy