Struts2中把某些公共性的功能放置到拦截器中,一般一个拦截器只负责一个功能.
拦截器的与过滤器有很多的相似之处,其中过滤器依赖于servlet容器,拦截器基于反射,不依赖servlet容器,
过滤器主要拦截action请求,过滤器可以根据配置文件过滤,过滤器的影响范围更大
执行时机过滤器早于拦截器
自定义拦截器
- 实现
Interceptor
接口,该方法里面需要实现destroy()
,init()
与intercept()
方法,但是主要使用的只有intercept()
实现代码如下:
public class HibernateInterceptor implements Interceptor {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init() {
// TODO Auto-generated method stub
}
@Override
public String intercept(ActionInvocation ai) throws Exception {
System.out.println("过滤器前操作");
String s = ai.invoke();
System.out.println("过滤器后操作");
return s;
}
}
- 继承
AbstractInterceptor
抽象类,这个方法只需要实现使用的intercept()
方法即可
代码如下:
public class HibernateInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation ai) throws Exception {
HibernateUtil.getSession();
String invoke = ai.invoke();
HibernateUtil.closeSession();
return invoke;
}
}
- 方法过滤拦截方式,可以在设置全部拦截之后设置访问某些action方法时不拦截,比如获取是否登录才能进行发消息,不能拦截登录访问,注册访问等等.此方法需要继承
MethodFilterInterceptor
抽象类,实现其中的doIntercept()
方法,在实现方法时与实现上述两种的方式类似,但是在配置action标签是有所不同,代码如下:
Java代码:
public class HibernateInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation ai) throws Exception {
System.out.println("前处理");
String s = ai.invoke();
System.out.println("后处理");
return s;
}
}
普通拦截xml配置文件,先配置哪个拦截器则先运行哪个拦截器,运行顺序为123321,其中前123为过滤器的前处理,321为过滤器的后处理,在执行invoke
方法后,其返回的逻辑视图修改无效.
<interceptors>
<interceptor name="HibernateInterceptor" class="cn.filter.HibernateInterceptor"></interceptor>
<interceptor-stack name="myInterceptor">
<interceptor-ref name="HibernateInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myInterceptor"></default-interceptor-ref>
也可不配置
default-interceptor-ref标签,在每个action中加入
即可,自定义拦截器后,必须继承
``,要不然Struts自带的拦截器不再通过,当然,对Struts拦截器比较熟悉的可以自定义配置使用哪个struts拦截器
方法过滤xml配置文件
<interceptors>
<interceptor name="HibernateInterceptor" class="cn.filter.HibernateInterceptor"></interceptor>
<interceptor-stack name="myInterceptor">
<interceptor-ref name="HibernateInterceptor">
<param name="excludeMethods">方法名</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myInterceptor"></default-interceptor-ref>
此时,在访问<param name="excludeMethods">方法名</param>
中的方法名
时控制台不会打印前处理后处理,同样,也可以设置不拦截的方法,把其name
属性值改为includeMethods
即可