Interceptor(拦截器)是Struts2的一个非常强大的工具,有许多功能都是构建于它之上,如国际化、转换器,校验等。
什么是拦截器
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
实现原理
Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个list,最后一个一个地调用列表中的拦截器,如图所示:
配置和使用已有的拦截器
只需要在struts.xml配置文件中通过“
一旦你继承了struts-default包,所有Action都会调用拦截器栈 ——defaultStack。
当然,在Action配置中加入“
自定义拦截器
在Struts 2自定义拦截器是相当容易的一件事。
在开始创建自定义拦截器前,切记以下原则:
所有的拦截器必须是无状态的,不要使用在API提供的ActionInvocation之外的任何东西。
要求拦截器是无状态的原因很简单是,Struts 2不能保证为每一个请求或者action创建一个实例,所以如果拦截器带有状态,会引发并发问题。
以下例子演示通过继承AbstractInterceptor,实现拦截器。
1.首先,创建一个检查是否登录的类,CheckLogin.java,代码如下:
@Override
public String intercept(ActionInvocation ai) throws Exception {
ActionContext ctx = ai.getInvocationContext();
Map session = ctx.getSession();
String user = (String) session.get("user");
if (user != null) {
return ai.invoke();
} else {
return "login";
}
}
}
可以看出,其实拦截器就是一个非常普通的类,代码相当简单,我们通过检查session中的user为空,判断用户是否登陆,未登录的话,返回“login”,使用户跳转到首页。
2.配置struts.xml文件
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="upload" extends="struts-default">
<!-定义拦截器->
<interceptors>
<!-定义权限拦截器->
<interceptor name="checkLogin" class="edu.bjtu.common.filter.CheckLogin"></interceptor>
<interceptor-stack name="mydefaultstcak">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="checkLogin"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mydefaultstcak"></default-interceptor-ref>
<global-results>
<result name="login">/fail.jsp</result>
</global-results>
<!-上传文件->
<action name="uploadAction" class="uploadAction">
<result name="success">/jsp/resource/upload.jsp</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="checkLogin"></interceptor-ref>
</action>
</package>
</struts>
通过以上步骤就简单完成立一个拦截器。
以上代码和上次的SSH实现文件上传功能相结合,就能实现在用户点击上传文件Action后判断是否登录,如果没登录,则跳转到首页。