關於struts2和spring security的結合以及spring security傳參的問題

來源:互聯網
上載者:User

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的參數值。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.