首页 > 代码库 > Spring Security应用开发(11) 并发控制之实践
Spring Security应用开发(11) 并发控制之实践
本文分别介绍了四种不同情况下,Spring Security的Session管理和并发控制的不同配置的配置方法,以及所产生的效果。
(1)首先编写了session_error.jsp页面,用于展示session相关错误信息。
错误信息通过页面参数id传入。
<p>Session Error:${param.id }</p> <p>${SPRING_SECURITY_LAST_EXCEPTION.message}</p>
(2)编写相应的SessionController类。
@Controller @RequestMapping(value="/login") public class SessionController { @RequestMapping("/session_error.action") public ModelAndView session_error(String id){ System.out.println("session_error:" + id); ModelAndView mv = new ModelAndView(); mv.setViewName("login/session_error"); return mv; } }
(3)编写spring-security.xml中的session管理相关配置,同时增加相关的匿名访问控制支持。
(a)情况一:首先测试在session个数超过限制时不报错,而且没有配置invalid-session-url的情况。
<!-- session管理 --> <sec:session-management session-fixation-protection="changeSessionId" session-authentication-error-url="/login/session_error.action?id=max_session_error" > <!-- invalid-session-url="/login/session_error.action?id=invalid_session_error" --> <sec:concurrency-control max-sessions="1" expired-url="/login/session_error.action?id=session_expired_error" error-if-maximum-exceeded="false" /> </sec:session-management> <!-- 匿名访问 --> <sec:anonymous enabled="true" granted-authority="ROLE_ANONYMOUS" /> <sec:intercept-url pattern="/" access="hasRole(‘ROLE_ANONYMOUS‘) or hasRole(‘ROLE_USER‘)" /> <sec:intercept-url pattern="/login/**" access="hasRole(‘ROLE_ANONYMOUS‘) or hasRole(‘ROLE_USER‘)" />
在浏览器1中登录成功。
然后在浏览器2中登录成功。
再返回到浏览器1中去点击一个链接。
可以看到先前已登录的浏览器1的登录失效过期了。
(b)情况二:再测试测试在session个数超过限制时不报错,而且配置了invalid-session-url的情况。
<!-- session管理 --> <sec:session-management session-fixation-protection="changeSessionId" session-authentication-error-url="/login/session_error.action?id=max_session_error" invalid-session-url="/login/session_error.action?id=invalid_session_error" > <sec:concurrency-control max-sessions="1" expired-url="/login/session_error.action?id=session_expired_error" error-if-maximum-exceeded="false" /> </sec:session-management>
在浏览器1中登录成功。
在浏览器2中登录成功。
再返回浏览器1,点击一个链接。
可以看到页面跳转到了invalid-session-url指定的URL,而不再是expired-url指定的URL。
(c)情况三:测试在session个数超过限制时报错的情况。此时是否指定invalid-session-url影响不大。
在使用form-login表单验证的情况下,都将跳转到form-login的属性authentication-failure-url指定的URL,如果没指定此URL,则跳转到该属性的默认值指定的URL。
<sec:session-management session-fixation-protection="changeSessionId" session-authentication-error-url="/login/session_error.action?id=max_session_error" invalid-session-url="/login/session_error.action?id=invalid_session_error" > <sec:concurrency-control max-sessions="1" expired-url="/login/session_error.action?id=session_expired_error" error-if-maximum-exceeded="true" /> </sec:session-management> <sec:form-login login-page="/login/login_form.action" username-parameter="username" password-parameter="password" login-processing-url="/login/login_process.action" authentication-success-forward-url="/login/login_success.action" authentication-failure-url="/login/login_failed.action" />
在浏览器1中登录成功。
然后在浏览器2中登录。
此时跳转到了form-login的authentication-failure-url指定的URL。
(d)情况四:测试在session个数超过限制时报错的情况。在没有使用form-login表单认证的情况下,超过session个数限制时将跳转到session-manager的属性authentication-failure-url指定的URL。本次测试启用了HTTP basic 认证。
<!-- 登录相关页面 --> <!-- <sec:form-login login-page="/login/login_form.action" username-parameter="username" password-parameter="password" login-processing-url="/login/login_process.action" authentication-success-forward-url="/login/login_success.action" authentication-failure-url="/login/login_failed.action" /> --> <!-- HTTP Basic Authentication --> <sec:http-basic />
在浏览器1中登录成功。
在浏览器2中登录:
可以看到登录失败时页面跳转到了session-manager结点的属性authentication-failure-url指定的URL。
对上述四种情况下的测试情况,总结如下:
(1)Spring security的配置参数非常灵活多变,能够适应比较复杂的应用需求。
(2)配置参数过于灵活,实际应用时容易出错。
(3)本次测试基本验证了前一篇博客的内容。
Spring Security应用开发(11) 并发控制之实践