关于Struts 2 拦截器参数丢失问题 ,拦截器原理和实现

 在传参数的时候,发现参数丢失,导致页面出错 。

<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(); }  
    }
}

 

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

实现简介:http://developer.51cto.com/art/200906/126894.htm

实现原理详解:http://struts2.group.iteye.com/group/wiki/1397-deep-into-struts2-interceptors

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值