• 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

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

  • 相关阅读:
    Android 10 应用层如何操作设备节点/sys/devices
    无人机和热成像
    文件服务器系统迁移改造之路
    贪心算法(二) | 重叠区间问题 | leecode刷题笔记
    基于 DSP+FPGA 的排爆机器人控制系统设计与实现
    使用微服务的最佳实践:编写、测试、保护和部署微服务(PDF)
    我有一篇Java Stream使用手册,学了就是你的了!
    20.RTSP取流实现方法
    C++统一初始化和初始化列表
    Humanoid Robotics Whole Body Control(WBC)全身控制
  • 原文地址:https://blog.csdn.net/weixin_44728473/article/details/125455015