首页 > 代码库 > 8.Struts2拦截器

8.Struts2拦截器

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>
只要是引用自己的拦截器,默认栈的拦截器就不执行了,必须要手动引入默认栈

8.Struts2拦截器