• Springboot——拦截器


    目录

    一、拦截器概念

    二、拦截器的使用

     2.1  拦截器的创建(preHandle实用性最强)

     2.2 将拦截器添加到容器当中

    三、拦截器参数

    3.1 获取请求头 request.getHeader

    3.2 Object handler 是什么参数

             3.3 ModelAndView modelAndView

    3.4 Exception ex

    3.5 HttpServletRequest request

    3.6 HttpServletResponse response

    四、多拦截器执行顺序


    一、拦截器概念

      拦截器(Interceptor):是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行(类似有保安拦截检查,正常才通过)

      作用:

    • 在指定的方法调用前后执行预先设定的代码(比如权限的校验就是在访问controller之前校验)
    • 阻止原始方法的执行(把原始的方法终止掉)

     

    拦截器与过滤器的区别

    •  归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
    •  拦截器内容不同:Filter对所有访问进行增强(在Tomcat服务器进行配置),Interceptor仅针对SpringMVC的访问进行增强

    二、拦截器的使用

     2.1  拦截器的创建(preHandle实用性最强)

    1. /**
    2. * 登录检查
    3. * 1.配置到拦截器要拦截哪些请求
    4. * 2.把这些配置放在容器中
    5. *
    6. * 实现HandlerInterceptor接口
    7. */
    8. public class LoginInterceptor implements HandlerInterceptor {
    9. /**
    10. * 目标方法执行之前
    11. * 登录检查写在这里,如果没有登录,就不执行目标方法
    12. * @param request
    13. * @param response
    14. * @param handler
    15. * @return
    16. * @throws Exception
    17. */
    18. @Override
    19. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    20. // 获取进过拦截器的路径
    21. String requestURI = request.getRequestURI();
    22. // 登录检查逻辑
    23. HttpSession session = request.getSession();
    24. Object loginUser = session.getAttribute("loginUser");
    25. if(loginUser !=null){
    26. // 放行
    27. return true;
    28. }
    29. // 拦截 就是未登录,自动跳转到登录页面,然后写拦截住的逻辑
    30. return false;
    31. }
    32. /**
    33. * 目标方法执行完成以后
    34. * @param request
    35. * @param response
    36. * @param handler
    37. * @param modelAndView
    38. * @throws Exception
    39. */
    40. @Override
    41. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    42. HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    43. }
    44. /**
    45. * 页面渲染以后
    46. * @param request
    47. * @param response
    48. * @param handler
    49. * @param ex
    50. * @throws Exception
    51. */
    52. @Override
    53. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    54. HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    55. }
    56. }

     2.2 将拦截器添加到容器当中

    1. @Configuration
    2. //定制SpringMVC的一些功能都使用WebMvcConfigurer
    3. public class AdminWebConfig implements WebMvcConfigurer {
    4. /**
    5. * 配置拦截器
    6. * @param registry 相当于拦截器的注册中心
    7. */
    8. @Override
    9. public void addInterceptors(InterceptorRegistry registry) {
    10. // 下面这句代码相当于添加一个拦截器 添加的拦截器就是我们刚刚创建的
    11. registry.addInterceptor(new LoginInterceptor())
    12. // addPathPatterns()配置我们要拦截哪些路径 addPathPatterns("/**")表示拦截所有请求,包括我们的静态资源
    13. .addPathPatterns()
    14. // excludePathPatterns()表示我们要放行哪些(表示不用经过拦截器)
    15. // excludePathPatterns("/","/login")表示放行“/”与“/login”请求
    16. // 如果有静态资源的时候可以在这个地方放行
    17. .excludePathPatterns("/","/login");
    18. }
    19. }

    三、拦截器参数

    3.1 获取请求头 request.getHeader

    1. @Override
    2. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    3. String contenType = request.getHeader("Content-Type");
    4. System.out.println("preHandle..."+contenType);
    5. // 放行
    6. return true;
    7. }

     

    3.2 Object handler 是什么参数

    1. @Override
    2. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    3. String contenType = request.getHeader("Content-Type");
    4. System.out.println(handler);
    5. System.out.println("preHandle..."+contenType);
    6. // 放行
    7. return true;
    8. }

    使用PostMan发送请求后,控制台出现下面这个样子

    class org.springframework.web.method.HandlerMethod

    这个参数有什么用?

       被调用的处理器对象,本质上是一个方法对象,对反射技术中的Method对象进行了再包装

    1. @Override
    2. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    3. String contenType = request.getHeader("Content-Type");
    4. // System.out.println(handler);
    5. HandlerMethod hm = (HandlerMethod)handler;
    6. // 通过hm.getMethod()就可以拿到原始执行的对象,拿到这个对象就可以进行反射
    7. hm.getMethod();
    8. System.out.println("preHandle..."+contenType);
    9. // 放行
    10. return true;
    11. }

    3.3 ModelAndView modelAndView

    封装了SpringMVC进行页面跳转的相关数据,但是我们现在都是反JSON,一般不会这么搞了

    3.4 Exception ex

    通过这个ex可以拿到原始的程序执行过程中出现的异常的

    假设controller层抛了异常,在这里是可以拿到异常对象的,但是我们有异常处理机制,所以这里就没有那么大的需求了

    如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理

    3.5 HttpServletRequest request

       request:请求对象


    3.6 HttpServletResponse response

      response:响应对象

    四、多拦截器执行顺序

     当配置多个拦截器时,形成拦截器链

     下图是第二个拦截器

    1. @Configuration
    2. //定制SpringMVC的一些功能都使用WebMvcConfigurer
    3. public class AdminWebConfig implements WebMvcConfigurer {
    4. /**
    5. * 配置拦截器
    6. * @param registry 相当于拦截器的注册中心
    7. */
    8. @Override
    9. public void addInterceptors(InterceptorRegistry registry) {
    10. // 下面这句代码相当于添加一个拦截器 添加的拦截器就是我们刚刚创建的
    11. registry.addInterceptor(new LoginInterceptor())
    12. // addPathPatterns()配置我们要拦截哪些路径 addPathPatterns("/**")表示拦截所有请求,包括我们的静态资源
    13. .addPathPatterns()
    14. // excludePathPatterns()表示我们要放行哪些(表示不用经过拦截器)
    15. // excludePathPatterns("/","/login")表示放行“/”与“/login”请求
    16. // 如果有静态资源的时候可以在这个地方放行
    17. .excludePathPatterns("/","/login");
    18. // 第二个拦截器
    19. registry.addInterceptor(new LoginInterceptor2()).addPathPatterns("/books");
    20. }
    21. }

    那当我们配置了两个拦截器以后,会有一个执行顺序

    拦截器链的运行顺序参照拦截器添加顺序为准,下面就是三个拦截器时的执行顺序

     

  • 相关阅读:
    11.25学到的东西==命令行
    进程与线程
    【多服务场景化解决方案】智能家居(UrbanHome)
    Android开发基础——Kotlin:扩展函数和运算符重载
    淘宝详情api(获取主图)2023年11月20日最新版本
    网络协议端口(信息安全工程师典藏版)
    java计算机毕业设计盘山县智慧项目管理系统源码+系统+数据库+lw文档+mybatis+运行部署
    GeoServer + openlayers
    3、字符设备驱动框架和开发步骤
    【面试指南】AI算法面试
  • 原文地址:https://blog.csdn.net/weixin_51351637/article/details/128058053