關於Struts 2 攔截器參數丟失問題

from:http://www.cnblogs.com/huzx/archive/2011/06/09/2076328.html

今天在做用戶的登陸認證的時候出現的問題。

 在傳參數的時候,發現參數丟失,導致頁面出錯 。

<interceptors>

                 <interceptor name="checkLogin" class="com.topsoft.interceptor.LoginInterceptor" />
</interceptors>

<action name="login" class="com.action.LoginAction">
    <result name="success">/admin/list.jsp</result> 
    <interceptor-ref name="checkLogin" />
</action> 

 在網上找了一下,說struts-default中,默認的攔截器引用是defaultstack,這個攔截器包傳說是經過精心設計的。。所以會把所有的參數注入!。。。

因此要更改默認攔截器,需要加上這個defaultstack.

修改如下

<interceptors>
   <interceptor name="checkLogin" class="com.topsoft.interceptor.LoginInterceptor" />
   <interceptor-stack name="checkLoginStack">
          <interceptor-ref name="checkLogin"></interceptor-ref>
          <interceptor-ref name="defaultStack"></interceptor-ref>
     </interceptor-stack> 
</interceptors>

這裏的action的攔截器就引用這個checkLoginStack

<action name="login" class="com.action.LoginAction">
    <result name="success">/admin/list.jsp</result> 
    <interceptor-ref name="checkLoginStack" />
</action>

下面貼出我自己的struts.xml的配置信息

<package name="administrator" extends="struts-default" namespace="/admin" >
    <!-- Interceptors -->
       <interceptors>
         <interceptor name="checkLogin" class="com.interceptor.LoginInterceptor" />

         <interceptor-stack name="checkLoginStack">
                   <interceptor-ref name="checkLogin"></interceptor-ref>

                  <interceptor-ref name="defaultStack"></interceptor-ref>
        </interceptor-stack> 
     </interceptors>
     <!-- 注意下面的綠色字的部分,我把登陸的action也放在了這個包下面,所以如果指定這個默認的攔截器的話,那登陸那裏就登陸不了了,因爲這個攔截器會對這個包裏的所有Action進行攔截。當登陸的時候,也會進行攔截,對session裏的User對象進行是否爲空的驗證,而這個時候session裏的User對象肯定是空的,那麼就被攔截下來了,不會跳轉到LoginAction進行登陸操作。 所以說這裏最好把登陸的Action放在別的包裏,這樣下面這一句就可以對該包的所有Action進行攔截,進行登陸認證,判斷用戶是否登陸,如果沒有登陸,那好,對不起,請你出去,登陸再來操作。所有在我的源配置文件裏,下面這一句是沒有的,不要弄錯了。-->

     <!--這一句會對該包裏的所有Action進行攔截,而不需要在Action裏具體指定該攔截器-->
     <default-interceptor-ref name="checkLoginStack"></default-interceptor-ref> 

     <global-results>
         <result name="login">/admin/login.jsp</result>
    </global-results>

    <action name="adminList" class="com.action.ArticleList">
           <result name="success">/admin/list.jsp</result>
         <interceptor-ref name="checkLoginStack"></interceptor-ref>
    </action>
    <!-- Login -->        
    <action name="loginn" class="com.action.LoginAction">
        <result name="success">/admin/index.html</result>  

        <result name="login">/admin/login.jsp</result>
    </action>

    <!-- get All User list -->
   <action name="userList" class="com.action.UserListAction">
          <result name="success">/admin/Users.jsp</result> 
         <interceptor-ref name="checkLoginStack"></interceptor-ref>
  </action>
</package>

這是登陸驗證的攔截器 

public class LoginInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation ai) throws Exception {
         // TODO Auto-generated method stub
         System.out.println("------------------Check Login----------------------------");
         Map<String,Object> session=(Map<String,Object>)ai.getInvocationContext().getSession();
         Admin user=(Admin)session.get("user");
         if(user==null)
        {    return Action.LOGIN; } else {    return ai.invoke(); }  
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章