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
(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) 並發控制之實踐