zoukankan      html  css  js  c++  java
  • 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>
    只要是引用自己的拦截器,默认栈的拦截器就不执行了,必须要手动引入默认栈
  • 相关阅读:
    内置函数(少量)
    画国旗(尺寸不标准)
    测试题——程序
    乱码笔记2--字典
    列表
    课堂笔记 ——————乱
    如何利用pip安装国内镜像源
    pip常用指令
    pip卸载
    pip简介
  • 原文地址:https://www.cnblogs.com/NEWHOM/p/6786321.html
Copyright © 2011-2022 走看看