核心:Struts2的核心就是拦截器,是基于过滤器开发的,所以最好与filter联动对比学习
思想:拦截器是AOP思想,也就是面向切面编程,通俗点说就是纵向重复,横向提取,对aop不太理解的可以参考
https://blog.youkuaiyun.com/yanquan345/article/details/19760027
拦截器与过滤器的区别 :
1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
拦截器执行原理:
拦截器会在处理请求之前对数据进行处理,实质是代理
过滤器写法:
1.注册一个类继承抽象类(AbstractInterceptor)或者实现接口(Interceptor)
拦截非法登录用到HttpServletRequest request=ServletActionContext.getRequest();
2.配置拦截器
当拦截器没有匹配到局部的结果后会自动寻找全局变量
3.注册拦截器
eg:
1、注册拦截器:
package com.struts.util;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyFilter extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation arg0) throws Exception {
//Action是actionInvocation的调度者,actionInvocation是执行者
HttpServletRequest request=ServletActionContext.getRequest();
Object obj=request.getAttribute("user");
if(obj==null){
return "faillogin";
}else{
arg0.invoke();
}
return null;
}
}
2、配置xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 配置拦截器栈 其中package可理解为拦截器封装在一起 ,与项目中包名意思是不同
name:包的名称,任意书写名称,但是不能与其他包名重复
extends:与oop中的继承差不多,实际上这里也是继承的意思
abstract:是否是抽象的,默认值为false,申明自己不能实例化,只能被继承,
然后由子类实现它的若干方法,最后由子类实例化所以struts-default包中不能包
含任何<action/>定义,具体的定义则是由其子包来定义的
-->
<package name="pub" extends="struts-default" abstract="true">
<interceptors>
<!-- 注册自定义拦截器 -->
<interceptor name="myFilter" class="com.struts.util.MyFilter"></interceptor>
<!-- 自定义拦截器进栈 讲究先进后出原则 -->
<interceptor-stack name="stacklogin">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myFilter"></interceptor-ref>
</interceptor-stack>
</interceptors>
<global-results>
<result name= "faillogin">/err.jsp</result>
</global-results>
</package>
</struts>
3、注册
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="dept" extends="pub">
<!--
dept_*:通配符
{1}:占位符
interceptor-ref:引用已经注册好的自定义拦截器
-->
<action name="dept_*" method="{1}" class="com.struts.action.DeptAction">
<interceptor-ref name="stacklogin"></interceptor-ref>
<result name="all">/dept/deptall.jsp</result>
<result name="upp">/dept/update.jsp</result>
</action>
</package>
</struts>
默认情况下,我们书写<package name="dept" extends="struts-default"></package>,而我们已经将拦截器封装在stack中,同时就继承了struts-default,所以我们在注册的时候直接调用就好,直接继承pub即可。