Spring MVC 拦截器编程开以及常见问题

写在前面:最近在对一个微服务增减接口拦截器的时候,定义的拦截器未能生效,并且未报任何异常,swagger的ui也无法正常访问。经查明原因:prehandler方法最后返回的布尔值是false,拦截器定义部分是从其他服务拷贝的文件,由于没有检查,导致未能生效。

  1. 配置拦截器

我这里配置拦截器没有使用 xml,使用的是java的方式配置的interceptor,这样比较直观,更容易理解。

InterceptorConfig这个类继承WebMvcConfigurerAdapter 抽象类,WebMvcConfigurerAdapter 抽象类 实现了 WebMvcConfigurer 接口。WebMvcConfigurer 该接口可以对拦截器的很多属性进行配置。

java 复制代码
package com.example.swaggertest.demos.web.Config;

import com.example.swaggertest.demos.web.Interceptor.CollrollerInterceptorHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //覆写拦截器过滤条件
        registry.addInterceptor(new CollrollerInterceptorHandler())
                .addPathPatterns("/**");  //对所有的接口进行过滤
    }


}
  1. 定义拦截器

CollrollerInterceptorHandler 实现了HandlerInterceptor 接口,这个接口里定义了三个方法,如代码所示。

java 复制代码
package com.example.swaggertest.demos.web.Interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CollrollerInterceptorHandler implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //编写拦截业务
        return true; //注意一定要返回true,否则容易出现与swagger集成问题,导致不能访问swagger的ui
    }

    @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);
    }
}
  1. 拦截器与过滤器的区别

拦截器与过滤器的区别

相关推荐
团子的二进制世界1 分钟前
G1垃圾收集器是如何工作的?
java·jvm·算法
long3166 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
独断万古他化16 分钟前
【SSM开发实战:博客系统】(三)核心业务功能开发与安全加密实现
spring boot·spring·mybatis·博客系统·加密
rannn_11133 分钟前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
灵感菇_34 分钟前
Java HashMap全面解析
java·开发语言
qq_124987075336 分钟前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
短剑重铸之日42 分钟前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
若鱼19191 小时前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
觉醒大王1 小时前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
努力学编程呀(๑•ี_เ•ี๑)1 小时前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea