• springmvc 梳理12--拦截器


    SpringMVC拦截器有许多应用场景,比如:登录认证拦截器,字符过滤拦截器,日志操作拦截器等等。

    1、自定义拦截器

    SpringMVC拦截器的实现一般有两种方式

    1. 自定义的Interceptor类要实现了Spring的HandlerInterceptor接口。

    2. 继承实现了HandlerInterceptor接口的类,比如Spring已经提供的实现了HandlerInterceptor接口的抽象类 HandlerInterceptorAdapter。

    2、拦截器拦截流程

    3、拦截器规则

    我们可以配置多个拦截器,每个拦截器中都有三个方法。下面将总结多个拦截器中的方法执行规律。

    1. preHandle:Controller方法处理请求前执行,根据拦截器定义的顺序,正向执行。
    2. postHandle:Controller方法处理请求后执行,根据拦截器定义的顺序,逆向执行。需要所有的preHandle方 法都返回true时才会调用。
    3. afterCompletion:View视图渲染后处理方法:根据拦截器定义的顺序,逆向执行。preHandle返回true就会 调用。
    public class LoginInterceptor implements HandlerInterceptor {
      @Override
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
      Object handler) {
        return true;
      }
      @Override
      public void postHandle(HttpServletRequest request, HttpServletResponse response,
      Object handler, ModelAndView modelAndView) {}
      @Override
      public void afterCompletion(HttpServletRequest request, HttpServletResponse
      response, Object handler, Exception ex) {}
    }

    4、登录拦截器

    接下来编写一个登录拦截器,这个拦截器可以实现认证操作。就是当我们还没有登录的时候,如果发送请求访问我 们系统资源时,拦截器不放行,请求失败。只有登录成功后,拦截器放行,请求成功。登录拦截器只要在 preHandle()方法中编写认证逻辑即可,因为是在请求执行前拦截。

    /**
         * 登录拦截器
         */
        public class LoginInterceptor implements HandlerInterceptor {
            /**
             在执行Controller方法前拦截,判断用户是否已经登录,
             登录了就放行,还没登录就重定向到登录页面
             */
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                                     Object handler) {
                HttpSession session = request.getSession();
                User user = session.getAttribute("user");
                if (user == null){
    //还没登录,重定向到登录页面
                    response.sendRedirect("/toLogin");
                }else {
    //已经登录,放行
                    return true;
                }
            }
            @Override
            public void postHandle(HttpServletRequest request, HttpServletResponse response,
                                   Object handler, ModelAndView modelAndView) {}
            @Override
            public void afterCompletion(HttpServletRequest request, HttpServletResponse
                    response, Object handler, Exception ex) {}
        }

    编写完SpringMVC拦截器,我们还需要在springmvc.xml配置文件中,配置我们编写的拦截器,配置代码如下:

    1. 配置需要拦截的路径

    2. 配置不需要拦截的路径

    3. 配置我们自定义的拦截器类

    <!--配置拦截器-->
    <mvc:interceptors>
      <mvc:interceptor>     <!--       mvc:mapping:拦截的路径       /**:是指所有文件夹及其子孙文件夹       /*:是指所有文件夹,但不包含子孙文件夹       /:Web项目的根目录-->     <mvc:mapping path="/**"/>     <!--     mvc:exclude-mapping:不拦截的路径,不拦截登录路径     /toLogin:跳转到登录页面     /login:登录操作     -->     <mvc:exclude-mapping path="/toLogin"/>     <mvc:exclude-mapping path="/login"/>     <!--class属性就是我们自定义的拦截器-->     <bean id="loginInterceptor" class="cn.zwq.springmvc.interceptor.LoginInterceptor"/>   </mvc:interceptor>


    <!--如果还有其他拦截器,那么还是按照上面的拦截器配置--> </mvc:interceptors>

    编写SpringMVC配置类,将自定义拦截器添加到配置中:

    @Configuration
    public class WebMvcConfig extends WebMvcConfigurerAdapter {
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
      //创建自定义的拦截器
      Interceptor interceptor = new LoginInterceptor();
      //添加拦截器
      registry.addInterceptor(interceptor)
      //添加需要拦截的路径
      .addPathPatterns("");
      }  
    }

    练习:

  • 相关阅读:
    思维发散的双刃剑
    一个请求过来都经过了什么?(Thrift版)
    业务开发转基础开发,这三种「高可用」架构你会么?
    程序常用的设计技巧
    美团分布式服务通信框架及服务治理系统OCTO
    《程序员修炼之道》解读
    面试官说:你真的不是不优秀只是不合适
    架构视角-文件的通用存储原理
    那些影响深远的弯路
    iOS sqlite ORM框架-LKDBHelper
  • 原文地址:https://www.cnblogs.com/Master-Sun/p/14335536.html
Copyright © 2020-2023  润新知