1. 拦截器的概述
* 拦截器就是AOP(Aspect-Oriented Programming)的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。)
* 过滤器:过滤从客服端发送到服务器端请求的
* 拦截器:拦截对目标Action中的某些方法进行拦截
* 拦截器不能拦截JSP
* 拦截到Action中某些方法
2. 拦截器和过滤器的区别
1)拦截器是基于JAVA反射机制的,而过滤器是基于函数回调的
2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器
3)拦截器只能对Action请求起作用(Action中的方法),而过滤器可以对几乎所有的请求起作用(CSS JSP JS)
* 拦截器 采用 责任链 模式
> 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链
> 责任链每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行
* 在struts2 中可以定义很多个拦截器,将多个拦截器按照特定顺序 组成拦截器栈 (顺序调用 栈中的每一个拦截器 )
3. Struts2的核心是拦截器自定义拦截器和配置(登录认证)
编写拦截器,需要实现Interceptor接口
/** * 自定义拦截器,判断当前系统是否已经登录,如果登录,继续执行。如果没有登录,跳转到登录页面 * @author Administrator */ public class UserInterceptor extends MethodFilterInterceptor{ private static final long serialVersionUID = 335018670739692955L; /** * 进行拦截的方法 */ protected String doIntercept(ActionInvocation invocation) throws Exception { // 获取session对象 User user = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser"); if(user == null){ // 说明,没有登录,后面就不会执行了 return "login"; } return invocation.invoke(); } }
<package name="crm" namespace="/" extends="struts-default"> <!-- 配置拦截器 --> <interceptors> <interceptor name="UserInterceptor" class="com.itheima.interceptor.UserInterceptor"/> </interceptors> <global-results> <result name="login">/login.htm</result> </global-results> <!-- 配置用户的模块 --> <action name="user_*" class="com.itheima.action.UserAction" method="{1}"> <!-- <result name="login">/login.htm</result> --> <result name="success">/index.htm</result> <interceptor-ref name="UserInterceptor"> <!-- login方法不拦截 --> <param name="excludeMethods">login</param> </interceptor-ref> <interceptor-ref name="defaultStack"/> </action> <!-- 客户模块 --> <action name="customer_*" class="com.itheima.action.CustomerAction" method="{1}"> <interceptor-ref name="UserInterceptor"/> <interceptor-ref name="defaultStack"/> </action> </package>
拦截器栈
<!-- 第二种方式:定义拦截器栈 --> <interceptors> <interceptor name="DemoInterceptor" class="com.itheima.interceptor.DemoInterceptor"/> <!-- 定义拦截器栈 --> <interceptor-stack name="myStack"> <interceptor-ref name="DemoInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <action name="userAction" class="com.itheima.demo3.UserAction"> <!-- 只要是引用自己的拦截器,默认栈的拦截器就不执行了,必须要手动引入默认栈 <interceptor-ref name="DemoInterceptor"/> <interceptor-ref name="defaultStack"/> --> <!-- 引入拦截器栈就OK --> <interceptor-ref name="myStack"/> </action>
只要是引用自己的拦截器,默认栈的拦截器就不执行了,必须要手动引入默认栈
时间: 2024-12-07 01:15:41