Springboot实现拦截器与过滤器
概述
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实现拦截器与过滤器相关推荐
- SpringBoot拦截器与过滤器
一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...
- springboot拦截器与过滤器详解
前言 不管是传统的ssm项目,还是springboot项目,拦截器和过滤器在项目开发中都离不开,比如说对于ssm框架类的项目来说,许多登录逻辑的前置校验,黑白名单的检查,以及部分请求的数据分析等依然需 ...
- springBoot 拦截器与过滤器
简介 过滤器 依赖于servlet容器.在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次.使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数 ...
- spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)
上一篇:spring boot 1.5.4 整合webService(十五) 1 Spring Boot整合redis和缓存 Spring Boot中除了对常用的关系型数据库提供了优秀的自动 ...
- Spring Boot实战:拦截器与过滤器
一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...
- SpringMVC框架 学习DAY_03:@RequestMapping注解/拦截器与过滤器
1. 关于@RequestMapping注解 在控制器中,在处理请求的方法之前添加@RequestMapping注解,可以配置请求路径与处理请求的方法的映射关系! 在@RequestMapping注解 ...
- Struts2中的拦截器与过滤器学习
拦截器是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法 ,比如动态代理就是拦截器的简单实现,过滤器是在java web中,你传入的request,res ...
- 框架:Spring Aop、拦截器、过滤器的区别
Spring Aop.拦截器.过滤器的区别 Filter过滤器:拦截web访问的url地址. Interceptor拦截器:拦截以.action结尾的url,拦截Action的访问. Spring A ...
- spring 两次进入拦截器_过滤器和拦截器的 6 个区别,别再傻傻分不清了
点击上方 肉眼品世界,选择 设为星标 深度价值体系传递 作者 :程序员内点事 来源 :toutiao.com/i6834310440495874563 毕竟这两种工具开发中用到的频率都相当高,应用起来 ...
- 拦截器,过滤器,监听器原理
过滤器 创建一个Filter 只需两个步骤: (1)创建Filter 处理类: (2)在web.xml 文件中配置Filter . 创建Filter 必须实现javax.servlet.Filte ...
最新文章
- 在进行商业运算时解决BigDecimal的精度丢失问题
- 【研发管理】华为十大架构与设计核心原则
- linux read nchars,Linux常用命令--read
- 漫谈单点登录(SSO)(淘宝天猫)(转载)
- html5 漂亮的左右布局_2020年庚子年风水布局,2020年家居风水布局汇总 | 影楼
- python画二维图_使用python绘制二维图形示例
- android手机导入.cer证书文件的方法
- 新中大怎么修改服务器,新中大如何修改服务器地址
- android 直播 app下载地址,朵朵直播app下载地址
- Python学习指南——1.常用库说明
- STC-ISP烧录软件
- FastReport 动态加载图片
- echarts图表联动案例
- eclipse配置Tomcat9
- 洛谷 — 旅行商的背包(背包)
- 计算机无限开机,电脑开机无限循环重启
- qt中socket通信流程图_Qt学习 之 Socket通信(世界上最简单的例子了)
- libtorch opecv c++ cmake clion
- 零基础该怎样开始学编程?
- COBOL中的基本语法(转)
热门文章
- Python数据分析与机器学习42-Python库分析科比生涯数据
- Boost Asio快速入门
- php用户注册审核,php 之 注册审核(0523)
- 玩转树莓派——游戏主机模拟器
- 老男孩python最新_老男孩Python高级运维自动化实战 老男孩Python高级运维开发10期 全套Python视频教程...
- 在Linux下实现一个使用键盘控制的虚拟鼠标
- RHCSA-Day1 --- Linux介绍及环境搭建
- python圣经是哪本_我的圣经:17年前的那本《Python 2.1 宝典》
- Javascript常用函数、方法速查手册
- javascript手册地址