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>

      

  • 相关阅读:
    949. Largest Time for Given Digits
    450. Delete Node in a BST
    983. Minimum Cost For Tickets
    16. 3Sum Closest java solutions
    73. Set Matrix Zeroes java solutions
    347. Top K Frequent Elements java solutions
    215. Kth Largest Element in an Array java solutions
    75. Sort Colors java solutions
    38. Count and Say java solutions
    371. Sum of Two Integers java solutions
  • 原文地址:https://www.cnblogs.com/wqh17/p/6437138.html
Copyright © 2011-2022 走看看