Struts2自定义拦截器
概述
- Struts2 拦截器在访问某个 Action 方法之前或之后实施拦截, Struts2 拦截器是 可插拔的, 拦截器是 AOP 的一种实现。
- 拦截器栈(Interceptor Stack): 将拦截器按一定的顺序联结成一条链. 在访问被拦 截的方法时, Struts2拦截器链中的拦截器就会按其之前定义的顺序被依次调用。
自定义拦截器
- Interceptor 接口
com.opensymphony.xwork2.interceptor.Interceptor
阅读该接口API, 所有的自定义拦截器都需要实现该接口,且以单例运行。
init: 创建后初始化时被调用, 它在拦截器的生命周期内只被调用一次。
interecept: 每拦截一个动作请求, 该方法就会被调用一次。
destroy: 拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次.
- Struts2 自定义拦截器实现
- 定义一个类实现Interceptor接口
- 实现生命周期方法
- 声明和引用自定义拦截器
- 拦截器类
/**
* 登录拦截器
*/
public class LoginInterceptor implements Interceptor {
private static final long serialVersionUID = 286019271181543787L;
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
//如果是达到登录或者注册的action,则直接放行
if (action instanceof LoginAction || action instanceof RegAction) {
return invocation.invoke();
}
Map<String, Object> sessionMap = invocation.getInvocationContext().getSession();
//如果没有登录
if (sessionMap.get("username") == null) {
return "login";
}
//放行
else {
return invocation.invoke();
}
}
}
- 拦截器配置
<?xml version="1.0"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name="LoginPkg" namespace="/login" extends="struts-default">
<interceptors>
<!-- 注册拦截器 -->
<interceptor name="loginInterceptor" class="cn.csx.web.interceptor.LoginInterceptor" />
<!-- 自定义拦截器栈 -->
<interceptor-stack name="loginStack">
<interceptor-ref name="loginInterceptor" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<!-- 定义默认栈 -->
<default-interceptor-ref name="loginStack" />
<!-- 定义全局结果 -->
<global-results>
<result name="login">/login.jsp</result>
</global-results>
<!-- 注册登录action -->
<action name="LoginAction_*" class="cn.csx.web.interceptor.LoginAction" method="{1}">
<result name="success">/success.jsp</result>
<result name="loginView">/login.jsp</result>
</action>
</package>
</struts>