2.3.3. 会话管理 2.3.3.1. 检测超时
你可以配置Spring Security 检测失效的session ID, 并把用户转发到对应的URL。这 可以通过session-management 元素配置: <http> ... <session-management invalid-session-url="/sessionTimeout.htm" /> </http> 2.3.3.2. 同步会话控制
如果你希望限制单个用户只能登录到你的程序一次,Spring Security 通过添加下面简单的 部分支持这个功能。首先,你需要把下面的监听器添加到你的web.xml 文件里,让Spring Security 获得session 生存周期事件: <listener> <listener-class> org.springframework.security.web.session.HttpSessionEventPublisher

</listener-class> </listener> 然后,在你的application context 加入如下部分:

<http> ... 
 <session-management> 

<concurrency-control max-sessions="1" /> 
</session-management> 
</http>

这将防止一个用户重复登录好几次-第二次登录会让第一次登录失效。通常我们更想防止第 二次登录,这时候我们可以使用

<http> ... 
 <session-management> 

<concurrency-control max-sessions="1" error-if-maximum-exceeded="true" /> 
</session-management> 
</http>

第二次登录将被阻止, 通过“ 注入” , 我们的意思是用户会被转发到


authentication-failure-url,如果使用了form-based 登录。如果第二次验证使用了其 他非内置的机制,比如“remember-me”,一个“未认证”(402)错误就会发送给客户端。如 果你希望使用一个错误页面替代, 你可以在session-management 中添加 session-authentication-error-url 属性。


如果你为form-based 登录使用了自定义认证, 你就必须特别配置同步会话控制。更多的 细节可以在会话管理章节找到。 2.3.3.3. 防止Session固定攻击


Session 固定攻击是一个潜在危险,当一个恶意攻击者可以创建一个session 访问一个网站 的时候,然后说服另一个用户登录到同一个会话上(比如,发送给他们一个包含了session 标识参数的链接)。Spring Security 通过在用户登录时,创建一个新session 来防止这 个问题。如果你不需要保护,或者它与其他一些需求冲突,你可以通过使用<http>中的 session-fixation-protection 属性来配置它的行为,它有三个选项


migrateSession - 创建一个新session,把原来session 中所有属性复制到新session 中。这是默认值。 none - 什么也不做,继续使用原来的session。


newSession - 创建一个新的“干净的”session,不会复制session 中的数据。