拦截器(Interceptor),主要完成请求参数的解析、将页面表单参数赋给值栈中相应属性、执行功能检验、程序异常调试等工作求中极易出现中文乱码问题。每一个Action请求都包装在一系列的拦截器的内部,拦截器可以在Action执行之前做相似的操作也可以在Action执行之后做回收操作。Action可以将操作转交给下面的拦截器,也可以直接退出操作返回既定的页面。我以下要讲的是用户登录检查。
1.先定义一个类实现com.opensymphony.xwork2.interceptor.Interceptor接口,示例代码:
package com.gx.intercepter;
import java.util.Map;
import com.gx.po.User;
import com.gx.web.LoginAction;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class LoginIntercepter implements Interceptor{
/**
*
*/
private static final long serialVersionUID = 1L;
//Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源
@Override
public void destroy() {
System.out.println("LoginIntercepter 回收");
}
@Override
public void init() {
System.out.println("LoginIntercepter 初始化");
}
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
//排除登录Action
Object action= actionInvocation.getAction();//获取action
if (action instanceof LoginAction) {
System.out.println("LoginAction 退出拦截器");
return actionInvocation.invoke();
}
//获取session
Map<String, Object> session= actionInvocation.getInvocationContext().getSession();
User pfUser=(User) session.get("pfUser");
if (pfUser!=null && pfUser.getUserName().length()>0) {
System.out.println("已经登录,退出拦截器");
return actionInvocation.invoke();
}else{
System.out.println("没有登录,跳转到登录页面");
return "login";//对应全局的返回变量
}
}
}
2.strurs2.xml中拦截器(Interceptor)的配置,将拦截器设置为全局的。需要注意的是拦截器必须定义在被继承之前,还有就是不要忘记添加默认拦截器栈,不然Struts2的一些功能无法正常运行。示例代码:
<package name="base-package" extends="struts-default">
<interceptors>
<!-- 声明自定义拦截器 -->
<interceptor name="loginIntercepter" class="com.gx.intercepter.LoginIntercepter">
</interceptor>
<!-- 配置拦截栈 -->
<interceptor-stack name="myStack">
<!-- 添加自定义的拦截器 -->
<interceptor-ref name="loginIntercepter"></interceptor-ref>
<!-- 添加默认的拦截器栈 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 设置当前 namespace的默认拦截器栈 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<!-- 配置全局的返回 -->
<global-results>
<result name="login" type="redirect">/jsp/intercepter/login.jsp</result>
</global-results>
</package>
<package name="intercepterDemo" namespace="/intercepterDemo" extends="base-package">
<action name="loginAction" class="com.gx.web.LoginAction">
<result name="success" type="redirectAction">
<param name="namespace">/intercepterDemo</param>
<param name="actionName">testAction</param>
<param name="method">index</param>
</result>
<result name="error">/jsp/fail.jsp</result>
</action>
<action name="testAction" class="com.gx.web.TestAction" method="index">
<result name="success">/jsp/intercepter/test.jsp</result>
</action>
</package>