您的位置:首页 > 编程语言 > Java开发

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

2011-11-17 14:31 489 查看
在传参数的时候,发现参数丢失,导致页面出错 。
<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(); }

}

}

参考:/article/7169830.html

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

实现原理详解:http://struts2.group.iteye.com/group/wiki/1397-deep-into-struts2-interceptors
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: