1)開始遇到一個問題,所有的action怎麼都攔截不住,似乎spring security失效了,然後在所有的action前面加上“/”之後,在資料庫資源裡也是類似於/***.action就好了,這樣的話就沒有問題了。我個人覺得有個不錯的解決方式,就是不同角色可訪問的jsp建立不用的包,然後struts2設定檔裡用不同的package,不用的包作為不同的命名空間,這樣也比較清晰,然後在頁面所有的action前加上相應的包名,這樣攔截起來就更方便了,在資料庫的資源表裡只要配置/admin/**, /user/**等等就好。其實呢,spring security的這種攔截方式是request攔截,是ss預設的攔截方式,如果想使用forward攔截,記得在web.xml中進行配置如下:
<filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher></filter-mapping>
不過一般情況下用對request攔截最好,原因很簡單,就不用說了。
2)第二個就是從登陸頁面往後台傳參數的問題了,就是要在登入時多加幾個參數時,預設的AuthenticationProcessFilter既不支援儲存額外參數,也沒有提供擴充點來實現這個功能,實際上就算是Spring Security-3.x中也因為只能配置一個handler,實際擴充時還是比較麻煩。所以這個時候一般的選擇就是自訂過濾器了。為此我們要擴充AuthenticationProcessFilter,這裡可以寫一個loginFilter繼承AuthenticationProcessFilter,實際上我們只需要重寫attemptAuthentication()這個方法,先調用super.attemptAuthentication()獲得產生的Authentication,如果這部分沒有拋出異常,我們下面再去從request中獲得mark參數,再把這個參數儲存到session裡。最後返回authentication對象即可。
轉一段:
常見的問題就是要在登入時多加幾個參數時,預設的AuthenticationProcessFilter既不支援儲存額外參數,也沒有提供擴充點來實現這個功能,實際上就算是Spring Security-3.x中也因為只能配置一個handler,實際擴充時還是比較麻煩。所以這個時候一般的選擇就是自訂過濾器了。
我們的目標是在登入時除了填寫使用者名稱和密碼之外,再添加一個mark參數。
我們的目的是在登入時將這個參數儲存到session中,以備後用。為此我們要擴充AuthenticationProcessFilter:
public class LoginFilter extends AuthenticationProcessingFilter { public Authentication attemptAuthentication(HttpServletRequest request) throws AuthenticationException { Authentication authentication = super.attemptAuthentication(request); String mark = request.getParameter("mark"); request.getSession().setAttribute("mark", "mark"); return authentication; }}
實際上我們只需要重寫attemptAuthentication()這個方法,先調用super.attemptAuthentication()獲得產生的Authentication,如果這部分沒有拋出異常,我們下面再去從request中獲得mark參數,再把這個參數儲存到session裡。最後返回authentication對象即可。
下面修改設定檔,在xml中添加一個名為loginFilter的bean,使用custom-filter將它加入到過濾器鏈中,放到原來的form-login的前面。
<beans:bean id="loginFilter" class="com.family168.springsecuritybook.ch211.LoginFilter"> <custom-filter before="AUTHENTICATION_PROCESSING_FILTER" /> <beans:property name="authenticationManager" ref="_authenticationManager"/> <beans:property name="defaultTargetUrl" value="/"/></beans:bean>
這樣我們自訂的LoginFilter就會取代原本的AuthenticationProcessFilter處理使用者登入,並在使用者登入成功時將額外的mark參數儲存到session中。
之後在jsp中,我們就可以直接通過${sessionScope['mark']}來獲得mark的參數值。