zoukankan      html  css  js  c++  java
  • (转)关于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(); }  
        }
    }

  • 相关阅读:
    对象属性编辑器中实现像Size,Rectangle等可以展开的属性
    远程办公产品风口会不会把SOHO自由职业吹起来
    项目加
    推荐几款免费又好用的项目管理工具
    Sprint Retrospective
    敏捷管理的大概背景和Scrum的特性
    推荐几款最好用的项目管理系统,即好用又免费
    项目管理的需求变更问题
    敏捷管理有一个原则就是:拥抱变化
    推荐5款体验最好的项目管理工具
  • 原文地址:https://www.cnblogs.com/sandea/p/3844115.html
Copyright © 2011-2022 走看看