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