概述

Springboot实现拦截器与过滤器的方法网上很多文章,本文主要阐述实际实现拦截器过程中踩的一下坑.

1.拦截器

1.1.创建拦截器

1.1.1 实现HandlerInterceptor
package com.qihang.springdemo.interceptor;import com.qihang.springdemo.threadlocal.LoginInfoContext;
import com.qihang.springdemo.threadlocal.LoginThreadLocal;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Slf4j
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("loginInterceptor start handle....");String requestId = request.getHeader("request-id");String callerId = request.getHeader("caller-id");String apiName = request.getHeader("api-name");LoginInfoContext context = LoginInfoContext.builder().requestId(requestId).apiName(apiName).callerId(Long.valueOf(callerId)).build();LoginThreadLocal.setContext(context);log.info(String.format("requestId:%s,callerId:%s,apiName:%s",requestId,callerId,apiName));return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {LoginThreadLocal.removeContext();}
}
1.1.2 创建配置类实现WebMvcConfigurer
package com.qihang.springdemo.interceptor;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(getLoginInterceptorBean()).addPathPatterns("/**");}@Beanpublic LoginInterceptor getLoginInterceptorBean(){return  new LoginInterceptor();}
}
1.1.3 启动类添加包扫描配置

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;@ComponentScan(basePackages ={"com.qihang.springdemo.interceptor"})
@SpringBootApplication
public class SpringApplication {public static void main(String[] args) {org.springframework.boot.SpringApplication.run(SpringApplication.class, args);}}

1.2.拦截器失效解法

原因1:配置类没有加注解

原因2:启动类指定拦截器的包扫描

2.过滤器

2.1创建过滤器

2.1.1 实现Filter接口
package com.qihang.springdemo.filter;import com.qihang.springdemo.threadlocal.LoginInfoContext;
import com.qihang.springdemo.threadlocal.LoginThreadLocal;
import lombok.extern.slf4j.Slf4j;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@Slf4j
public class LoginFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {try {log.info("LoginFilter start handle....");HttpServletRequest request = (HttpServletRequest)servletRequest;String requestId = request.getHeader("request-id");String callerId = request.getHeader("caller-id");String apiName = request.getHeader("api-name");LoginInfoContext context = LoginInfoContext.builder().requestId(requestId).apiName(apiName).callerId(Long.valueOf(callerId)).build();LoginThreadLocal.setContext(context);log.info(String.format("requestId:%s,callerId:%s,apiName:%s",requestId,callerId,apiName));filterChain.doFilter(servletRequest, servletResponse);}finally {LoginThreadLocal.removeContext();}}
}
2.1.2 创建配置类
package com.qihang.springdemo.filter;import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@Slf4j
public class FilterConfig {@Beanpublic FilterRegistrationBean<LoginFilter> filterRegistrationBean(){FilterRegistrationBean<LoginFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new LoginFilter());registration.addUrlPatterns("/*");registration.setName("loginFilter");return registration;}
}

3.总结

  • 过滤器不需要在启动类上加包扫描就可以生效
  • 拦截器需要在启动类上配置每个要扫描的包,比较麻烦,所以个人推荐使用过滤器

Springboot实现拦截器与过滤器相关推荐

  1. SpringBoot拦截器与过滤器

    一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...

  2. springboot拦截器与过滤器详解

    前言 不管是传统的ssm项目,还是springboot项目,拦截器和过滤器在项目开发中都离不开,比如说对于ssm框架类的项目来说,许多登录逻辑的前置校验,黑白名单的检查,以及部分请求的数据分析等依然需 ...

  3. springBoot 拦截器与过滤器

    简介 过滤器 依赖于servlet容器.在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次.使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数 ...

  4. spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)

    上一篇:spring boot 1.5.4 整合webService(十五) 1      Spring Boot整合redis和缓存 Spring Boot中除了对常用的关系型数据库提供了优秀的自动 ...

  5. Spring Boot实战:拦截器与过滤器

    一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...

  6. SpringMVC框架 学习DAY_03:@RequestMapping注解/拦截器与过滤器

    1. 关于@RequestMapping注解 在控制器中,在处理请求的方法之前添加@RequestMapping注解,可以配置请求路径与处理请求的方法的映射关系! 在@RequestMapping注解 ...

  7. Struts2中的拦截器与过滤器学习

    拦截器是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法 ,比如动态代理就是拦截器的简单实现,过滤器是在java web中,你传入的request,res ...

  8. 框架:Spring Aop、拦截器、过滤器的区别

    Spring Aop.拦截器.过滤器的区别 Filter过滤器:拦截web访问的url地址. Interceptor拦截器:拦截以.action结尾的url,拦截Action的访问. Spring A ...

  9. spring 两次进入拦截器_过滤器和拦截器的 6 个区别,别再傻傻分不清了

    点击上方 肉眼品世界,选择 设为星标 深度价值体系传递 作者 :程序员内点事 来源 :toutiao.com/i6834310440495874563 毕竟这两种工具开发中用到的频率都相当高,应用起来 ...

  10. 拦截器,过滤器,监听器原理

    过滤器 创建一个Filter 只需两个步骤:  (1)创建Filter 处理类: (2)在web.xml 文件中配置Filter .  创建Filter 必须实现javax.servlet.Filte ...

最新文章

  1. 在进行商业运算时解决BigDecimal的精度丢失问题
  2. 【研发管理】华为十大架构与设计核心原则
  3. linux read nchars,Linux常用命令--read
  4. 漫谈单点登录(SSO)(淘宝天猫)(转载)
  5. html5 漂亮的左右布局_2020年庚子年风水布局,2020年家居风水布局汇总 | 影楼
  6. python画二维图_使用python绘制二维图形示例
  7. android手机导入.cer证书文件的方法
  8. 新中大怎么修改服务器,新中大如何修改服务器地址
  9. android 直播 app下载地址,朵朵直播app下载地址
  10. Python学习指南——1.常用库说明
  11. STC-ISP烧录软件
  12. FastReport 动态加载图片
  13. echarts图表联动案例
  14. eclipse配置Tomcat9
  15. 洛谷 — 旅行商的背包(背包)
  16. 计算机无限开机,电脑开机无限循环重启
  17. qt中socket通信流程图_Qt学习 之 Socket通信(世界上最简单的例子了)
  18. libtorch opecv c++ cmake clion
  19. 零基础该怎样开始学编程?
  20. COBOL中的基本语法(转)

热门文章

  1. Python数据分析与机器学习42-Python库分析科比生涯数据
  2. Boost Asio快速入门
  3. php用户注册审核,php 之 注册审核(0523)
  4. 玩转树莓派——游戏主机模拟器
  5. 老男孩python最新_老男孩Python高级运维自动化实战 老男孩Python高级运维开发10期 全套Python视频教程...
  6. 在Linux下实现一个使用键盘控制的虚拟鼠标
  7. RHCSA-Day1 --- Linux介绍及环境搭建
  8. python圣经是哪本_我的圣经:17年前的那本《Python 2.1 宝典》
  9. Javascript常用函数、方法速查手册
  10. javascript手册地址