拦截器简介
类似于过滤器的功能,过滤器可过滤项目任何请求(servlet/jsp),但拦截器只能拦截Action,拦截后,添加逻辑代码
拦截器编写规则
编写类,继承Interceptor接口
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
/**
* @Description
* @Author xz
* @Date 2019/6/19 19:36
* @Version 1.0
**/
public class MyInterceptor1 implements Interceptor {
public MyInterceptor1() {
System.out.println("Myinterceptor");
}
/**
* 销毁方法
*/
@Override
public void destroy() {
}
/**
* 初始化方法
*/
@Override
public void init() {
System.out.println("init");
}
/**
* 拦截方法
* @param actionInvocation
* @return
* @throws Exception
*/
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
System.out.println("拦截之前");
//放行 执行下一个拦截器 如无拦截,进入目标action
actionInvocation.invoke();
System.out.println("拦截后");
return null;
}
}
xml配置
<interceptors>
<!-- 拦截器名称 以及 具体拦截器路径-->
<interceptor name="inter1" class="interceptors.MyInterceptor1"></interceptor>
</interceptors>
<action name="hello" class="HelloAction">
<!-- action中引入 拦截器 名称即可-->
<interceptor-ref name="inter1"></interceptor-ref>
<result name="success">/success.jsp</result>
<result name="index">/index.jsp</result>
<result name="input">/err.jsp</result>
</action>
那么我们在访问当前Action类时,会自动触发拦截器进行拦截
拦截器启动顺序
- 启动项目,拦截器对象创建,调用拦截器的init方法
- 访问Action 创建Action对象
- 执行拦截器的intercept();
- 执行拦截器前面的代码
- 执行actionInvocation.invoke(); 放行
- 执行拦截器后的代码
注意:拦截器范围
局部使用:action 使用
全局使用:当前包作用
当前包作用可以这样配置
<default-interceptor-ref name="inter1"></default-interceptor-ref>
这个时候我们再尝试使用用户登录,结果发现问题,登录是有问题的,后台根本接收不到页面提交的数据,原因是 当前包的拦截器会把父包(struts-default)覆盖掉
也就是说我们在声明全局拦截器的时候不能这么干,不然struts提供默认的拦截器我们都用不到了。解决办法使用拦截器栈
配置如下:
<!-- 定义拦截器 -->
<interceptors>
<!-- 拦截器名称 以及 具体拦截器路径-->
<interceptor name="inter1" class="interceptors.MyInterceptor1"></interceptor>
<!-- 声明拦截器栈 -->
<interceptor-stack name="interStack">
<!-- 加入自定义拦截器 -->
<interceptor-ref name="inter1"></interceptor-ref>
<!-- 加入默认拦截器 必须操作 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 引入拦截器栈 -->
<default-interceptor-ref name="interStack"></default-interceptor-ref>
到此拦截器配置完毕