• Spring Boot自定义拦截器(HandlerInterceptor)使用


    Spring Boot拦截器的作用:
    拦截器主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能。
    定义拦截器
    在 Spring Boot 中定义拦截器十分的简单,只需要创建一个拦截器类,并实现 HandlerInterceptor 接口即可。
    HandlerInterceptor 接口中定义以下 3 个方法,如下表。

    返回值类型方法声明描述
    booleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
    voidpostHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)该方法在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改。
    voidafterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)该方法在视图渲染结束后执行,可以通过此方法实现资源清理、记录日志信息等工作。

    例:
    1.自定义拦截器

    package com.example.iterceptor;
    
    import cn.hutool.core.util.StrUtil;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    //实现HandlerInterceptor接口
    public class LoginIterceptor implements HandlerInterceptor {
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
        }
    
        //实现方法
        @Override
        public boolean preHandle(HttpServletRequest request,
                                 HttpServletResponse response,
                                 Object handler)
                throws Exception {
            String token = request.getParameter("token");
            if (StrUtil.isEmpty(token)) {
                response.sendRedirect("/login");
            }
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    2.注册拦截器

    package com.example.config;
    
    import com.example.iterceptor.LoginIterceptor;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    /**
     * 拦截器配置
     * 创建一个实现了 WebMvcConfigurer 接口的配置类(使用了 @Configuration 注解的类),
     * 重写 addInterceptors()方法,并在该方法中调用 registry.addInterceptor()
     * 方法将自定义的拦截器注册到容器中。
     */
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            LoginIterceptor loginIterceptor = new LoginIterceptor();
            registry.addInterceptor(loginIterceptor)
                    .addPathPatterns("/api/**")//拦截路径
                    .excludePathPatterns("/css/**", "images/**", "/js/**", "/login");//放行路径
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    3.测试/api/**

    package com.example.controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/api")
    public class DemoController {
    
        @RequestMapping("/kiss")
        public String kiss(){
            return "么么哒";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    结果:
    在这里插入图片描述
    在这里插入图片描述
    4.测试普通接口路径

    package com.example.controller;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class LoginController {
        @GetMapping("/login")
        public String login() {
            return "请登录";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    结果:
    在这里插入图片描述

  • 相关阅读:
    (动手学习深度学习)第13章 计算机视觉---微调
    SpringBoot面试题4:Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
    前端笔试练习题——JS5 创建数组、JS6 判断版本
    [附源码]计算机毕业设计葡萄酒销售管理系统论文Springboot程序
    java基于springboot+vue的学生考勤请假打卡管理系统 elementui
    区块链交易平台服务器该怎么选
    JavaFx 生成二维码工具类封装
    latex修改公式的默认编号
    Java核心篇,二十三种设计模式(二十一),行为型——策略模式
    axios异步请求二次封装,发起请求添加loading及拦截重复请求
  • 原文地址:https://blog.csdn.net/weixin_44728473/article/details/125455015