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>
    只要是引用自己的拦截器,默认栈的拦截器就不执行了,必须要手动引入默认栈
  • 相关阅读:
    atitit...触发器机制 ltrigger mechanism sumup .的总结O8f
    atitit. 集合groupby 的实现(2)---自定义linq查询--java .net php
    atitit. groupby linq的实现(1)-----linq框架选型 java .net php
    atitit.j2ee 1.5 1.6 的不同跟 Servlet 3.0新特性总结
    Atitit. 常用街机系统and 模拟器总结 snk neo geo cps mame sfc smc
    atitit. access token是什么??微信平台公众号开发access_token and Web session保持状态机制
    atitit.二进制数据无损转字符串网络传输
    atitit.压缩算法 ZLib ,gzip ,zip 最佳实践 java .net php
    Atitit.现实生活中最好使用的排序方法-----ati排序法总结
    atitit.修复xp 操作系统--重装系统--保留原来文件不丢失
  • 原文地址:https://www.cnblogs.com/NEWHOM/p/6786321.html
Copyright © 2011-2022 走看看