zoukankan      html  css  js  c++  java
  • struts2之拦截器

    1. 为什么需要拦截器

      早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足、可扩展性降低,

      Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于系统的解耦.

    2. 什么是拦截器

      Struts 2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能

      拦截器用于拦截那些请求action的请求,可以在请求目标前执行一些代码,也可以在请求目标执行完毕后再执行一段代码.一般用于权限控制等

    2.1 拦截器栈    

      从结构上看,拦截器栈相当于多个拦截器的组合

      在功能上看,拦截器栈也是拦截器

    2.2 struts2系统拦截器

      params拦截器 

        负责将请求参数设置为Action属性
      servletConfig拦截器
        将源于Servlet API的各种对象注入到Action
      fileUpload拦截器
        对文件上传提供支持
      exception拦截器
        捕获异常,并且将异常映射到用户自定义的错误页面
      validation拦截器
        调用验证框架进行数据验证
      workflow拦截器
        调用Action类的validate(),执行数据验证

    struts-default.xml中定义一个defaultStack拦截器栈,并将其指定为默认拦截器
    只要在定义包的过程中继承struts-default包,那么defaultStack将是默认的拦截器

    3. struts2大致执行流程

      由上图可知,当一个请求到来时,首先经过核心过滤器,也就是我们在web.xml配置的 StrutsPrepareAndExecuteFilter这个filter,然后会执行一系列拦截器,最后执行action,执行完毕返回一个reuslt结果码,根据result来构建一个HttpServletResponse响应给客户端.

    2. 自定义拦截器

       1. 写一个拦截器类,此类可以实现Interceptor接口,也可以实现AbstractInterceptor抽象类.

        void init():初始化拦截器所需资源,此方法在服务器启动时执行!!

        void destroy():释放在init()中分配的资源,此方法在服务器关闭时执行!!

        String intercept(ActionInvocation ai) throws Exception :实现拦截器功能利用ActionInvocation参数获取Action状态,返回结果码(result)字符串. 此方法在拦截到请求时执行

        注意:继承AbstractInterceptor抽象类只提供了 String intercept(ActionInvocation ai) throws Exception 方法,init()和destroy()默认为空实现,所以如果仅仅需要做拦截操作,那么推荐继承这个抽象类.

    public class AuthorizationInterceptor extends AbstractInterceptor {
         
         public String intercept(ActionInvocation invocation) throws Exception{
              //获取用户会话信息
              Map session = invocation.getInvocationContext().getSession();
              User user = (User)session.get("login");
              if (user == null) {
                  //终止执行,返回登录页面
                  return Action.LOGIN;
              } else {
                  //继续执行剩余的拦截器和Action
                  return invocation.invoke();
              }
          }
    }

      2. 在配置文件配置

    <package name="renthouse" extends="struts-default">
        <interceptors>
            <!--定义权限验证拦截器-->
            <interceptor name="myAuthorization"
                class="cn.jbit.houserent.interceptor.AuthorizationInterceptor">
            </interceptor>
             <!--定义拦截器栈-->
            <interceptor-stack name="myStack">
                <interceptor-ref name="defaultStack"/> //引用struts2默认拦截器栈
                <interceptor-ref name="myAuthorization"/>  //引用我们自定义的拦截器
            </interceptor-stack>
        </interceptors>
        <!-- 定义默认拦截器 -->
        <default-interceptor-ref name="myStack"/>
       ...
    </package>

      

  • 相关阅读:
    nyoj-115-城市平乱(dijkstra算法)
    如何在大学里脱颖而出(其二)
    P6880-[JOI 2020 Final]オリンピックバス【最短路】
    P6847-[CEOI2019]Magic Tree【dp,线段树合并】
    P6800-[模板]Chirp Z-Transform【NTT】
    P5470-[NOI2019]序列【模拟费用流】
    P6563-[SBCOI2020]一直在你身旁【dp,单调队列】
    CF587F-Duff is Mad【AC自动机,根号分治】
    P7405-[JOI 2021 Final]雪玉【二分】
    互斥锁,IPC队列
  • 原文地址:https://www.cnblogs.com/wqh17/p/6437138.html
Copyright © 2011-2022 走看看