首页 > 代码库 > 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-loginauthentication-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) 并发控制之实践