zoukankan      html  css  js  c++  java
  • Struts2拦截器浅析

    一、拦截器简介:
    Struts2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能。
    拦截器方法在Action执行之前或者之后执行。
    拦截器栈:
    从结构上看,拦截器栈相当于多个拦截器的组合。
    在功能上看,拦截器栈也是拦截器。
    拦截器的执行过程是一个递归的过程,工作原理类似于过滤器。

               

    二、自定义拦截器的应用

               

             

    案例:统计Action的执行花费时间:

    思路:执行之后的时间-执行之前的时间= 执行Action消耗的时间

    1. 定义拦截器
    1.1.创建一个拦截器类继承自AbstractInterceptor类
    1.2.实现intercept方法
    
    eg:
        public String intercept(ActionInvocation invocation) throws Exception {
            //1.执行action之前
            long start=System.currentTimeMillis();
            //2.执行下一个拦截器,如果是最后一个拦截器,则执行目标action
            String result=invocation.invoke();
            //3.执行action之后
            long end=System.currentTimeMillis();
            //4.花费的时间
            long time=end-start;
            System.out.println("执行花费的时间: "+time+" ms");
            return result;
        }
    
    2. 配置拦截器
           <interceptors>
              <interceptor name="timeinterceptor" class="com.imooc.interceptor.TimerInterceptor"></interceptor>
           </interceptors>
    
    3. 引用拦截器
    <interceptor-ref name="timeinterceptor"></interceptor-ref>

    三、Struts2内置常用的拦截器

    1.params拦截器:
    -负责将请求参数设置为Action属性
    2.staticParams拦截器:
    -将配置文件中action元素的子元素param参数设置为Action属性
    3.servletConfig拦截器:
    -将源于Servlet API的各种对象注入到Action,必须实现对应接口
    4.fileUpload拦截器:
    -对文件上传提供支持,将文件和元素设置到对应的Action属性,实际上内部依然使用了Commons-FileUpload组件。
    5.exception拦截器:
    -捕获异常,并且将异常映射到用户自定义的错误页面
    6.validation拦截器:
    -调用验证框架进行数据验证
    
    更多的拦截器可在struts2-core包的struts-default.xml中查看
    默认拦截器栈:
    <!-- 为Action显示引用拦截器后,默认的拦截器defaultStack不再生效,需要手工引用。而且从顺序角度去讲,最好把默认的拦截器写在自定义拦截器上面 -->
    <interceptor-ref name="defaultStack"></interceptor-ref>

    四、使用拦截器实现权限控制

    下面是4个开发模式常用配置的简介---
        <!-- 开启使用开发模式,详细错误提示 -->
       <constant name="struts.devMode" value="true"/> 
        <!-- 指定每次请求到达,重新加载资源文件 -->
       <constant name="struts.i18n.reload" value="true"/> 
        <!-- 指定每次配置文件更改后,自动重新加载 -->
       <constant name="struts.configuration.xml.reload" value="true"/> 
        <!-- 指定XSLT Result使用样式表缓存 -->
       <constant name="struts.xslt.nocache" value="true"/> 

          

    相关代码:
    @struts.xml
    <struts>
    <package name="default" extends="struts-default" namespace="/">

    <!-- 注册拦截器 --> <!-- Ps:拦截器栈内的拦截器(除了默认拦截器)的name要与拦截器栈外的拦截器要一致,因为引用拦截器栈的时候,里面的拦截器是从外面的拦截器中的class引用的 --> <interceptors> <interceptor name="AuthI" class="com.imooc.interceptor.AuthInterceptor"></interceptor> <!-- 自定义拦截器mystack:组合了defaultStack和AuthI --> <interceptor-stack name="mystack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="AuthI"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 通过此Action访问后台管理页面,需要判断用户是否已登录,如果未登录则跳转到登录页面 --> <action name="Auth"> <result>/WEB-INF/page/manager.jsp</result> <result name="login">/login.jsp</result> <!-- 引用自定义的拦截器 --> <interceptor-ref name="mystack"></interceptor-ref> </action> <action name="Login" class="com.imooc.action.LoginAction" method="login"> <result>/WEB-INF/page/manager.jsp</result> <result name="error">/login.jsp</result> </action> </package> </struts>
  • 相关阅读:
    (一)IOC 容器:【2】@ComponentScan 自动扫描组件&指定扫描规则
    (一)IOC 容器:【11】Aware 注入Spring底层组件
    (一)IOC 容器:【10】@Autowired 自动装配
    (一)IOC 容器:【3】@Scope 设置组件作用域
    (一)IOC 容器:【8】Bean组件的生命周期
    每日日报7月13日
    每日日报7月12日
    每日日报7月11日
    Prism中的WeakEventHandlerManager
    博客开通标记
  • 原文地址:https://www.cnblogs.com/zjfjava/p/6673850.html
Copyright © 2011-2022 走看看