SpringBoot配置过滤器、拦截器
拦截器概述
Spring Boot提供了一种简单且强大的方式来定义和使用拦截器(Interceptor)。Spring Boot的拦截器基于Spring框架的拦截器机制,可以在请求的处理过程中插入自定义的逻辑。
Spring Boot的拦截器主要用于在请求处理的不同阶段执行额外的逻辑操作,比如在请求进入控制器方法之前或之后执行一些预处理或后处理操作。拦截器通常用于以下场景:
1.鉴权和权限控制:拦截器可以在请求进入控制器方法之前进行身份验证和权限检查,确保只有合法用户可以访问受限资源。
2.日志记录:拦截器可以记录请求的信息,例如请求的URL、请求参数、请求时间等,用于调试和系统监控。
3.跨域请求处理:拦截器可以处理跨域请求,添加必要的响应头信息以支持跨域资源共享。
4异常处理:拦截器可以捕获控制器方法抛出的异常,并进行适当的处理,例如记录异常日志、返回错误信息等。
Spring Boot的拦截器使用步骤如下:
创建一个拦截器类,实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类。在拦截器类中重写需要的方法,例如preHandle(在控制器方法执行前执行)、postHandle(在控制器方法执行后执行)和afterCompletion(在视图渲染完毕后执行)。在配置类或配置文件中注册拦截器,并指定拦截的路径和顺序。
Spring Boot的拦截器机制允许开发者通过配置简单的注解、路径匹配和顺序控制来灵活地应用拦截器。通过使用拦截器,开发者可以实现各种自定义的逻辑操作,并对请求进行统一处理,提高代码的复用性和可维护性。
示例代码
package com.example.common.conf.interceptor;
import com.example.common.response.ResultCode;
import com.example.common.conf.exceptions.CustomException;
import com.example.common.utils.JwtTokenUtils;
import com.example.common.utils.RedisUtil;
import com.mysql.cj.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* @ClassName: CustomInterceptor
* @Description: 拦截器
* @Author: WangBin
* @Date: 2023/5/18 17:09
*/
@Slf4j
@Component
public class CustomInterceptor implements HandlerInterceptor {
private static RedisUtil redisUtil;
@Autowired
public void init(RedisUtil redisUtil) {
CustomInterceptor.redisUtil = redisUtil;
}
/**
* 拦截所有请求,验证TOKEN是否有效
*
* @param request
* @param response
* @param handler
* @return
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 获取请求头中的token
String token = request.getHeader("token");
// 判断token是否存在或为空
if(StringUtils.isNullOrEmpty(token)) {
throw new CustomException(ResultCode.TOKEN_IS_NULL);
}
// 验证token是否有效
Map<String, Object> map = JwtTokenUtils.analysisToken(token);
if(map == null) {
throw new CustomException(ResultCode.TOKEN_ERROR);
}
// 从redis中读取用户信息(后续需要)
Map<Object, Object> userInfo = redisUtil.hmget(token);
System.out.println(userInfo);
if(userInfo == null || userInfo.isEmpty()) {
throw new CustomException(ResultCode.TOKEN_INVALID);
}
return true;
}
}
这里我验证拦截后验证token是否过期使用的是Redis,在登录验证成功的时候用当前用户信息生成token,然后将token和用户信息存入Redis中并设置过期时间,当Redis中存入的token过期后将自动销毁。
当需要验证token是否在有效期的的时候使用token在redis中去查询,如果可以查询到则说明没有过期,如果查询不到则说明token已经过期
(这里还可以加一段设置每个请求进来后重新给redis中的当前token设置过期时间,这样只要用户在一段时间内都有操作,这样就不会过期)至于redis的相关配置晚点再写吧;
代码里面的
throw new CustomException(...)是自定义注解和全局异常处理的,可以参考后面的代码
过滤器概述
Spring Boot提供了对Servlet过滤器(Filter)的支持,可以在应用程序的请求处理链中插入自定义的过滤器逻辑。过滤器是一种基于URL模式的组件,用于在请求到达Web应用程序的目标资源之前或之后执行一些操作。
Spring Boot的过滤器主要用于以下场景:
请求预处理:过滤器可以在请求到达控制器方法之前对请求进行预处理,例如对请求参数进行处理、字符编码转换、请求头处理等。
请求过滤和修改:过滤器可以根据一些规则对请求进行过滤和修改,例如拦截特定URL的请求、修改请求内容或请求头等。
响应过滤和修改:过滤器可以对响应进行过滤和修改,例如修改响应内容、添加响应头等。
跨域请求处理:过滤器可以处理跨域请求,添加必要的响应头信息以支持跨域资源共享。
使用Spring Boot的过滤器,可以按照以下步骤进行:
我们创建了一个WebConfig类,并实现了WebMvcConfigurer接口。通过addFilters方法,我们可以注册自定义的过滤器。在这里,我们创建了一个名为MyFilter的内部类作为自定义过滤器的实现。
在MyFilter中,我们可以根据需要重写init、doFilter和destroy方法来实现过滤器的初始化、过滤逻辑和销毁操作。
// 过滤器示意代码
package com.example.common.conf.interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: WebAppConfig
* @Description: 过滤器
* @Author: WangBin
* @Date: 2023/5/18 17:08
*/
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
List<String> urls = new ArrayList<>();
urls.add("/favicon.ico");
urls.add("/error");
urls.add("/swagger-resources/**");
urls.add("/webjars/**");
urls.add("/v2/**");
urls.add("/doc.html");
urls.add("**/swagger-ui.html");
urls.add("/swagger-ui.html/**");
registry.addInterceptor(new CustomInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login/**")
.excludePathPatterns(urls);
}
// 资源映射增加
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
WebMvcConfigurer.super.addResourceHandlers(registry);
}
// <-cors
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowCredentials(true)
.allowedOriginPatterns("*")
.allowedHeaders("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
// cors->
}
这里默认拦截全部请求,然后将登录已经swagger相关的放过
SpringBoot配置过滤器、拦截器的更多相关文章
- springboot jsp,过滤器,拦截器
springboot使用jsp,过滤器,拦截器(拦截器与过滤器区别重点) jsp使用配置 一 创建springboot项目在maven中暂时只添加两个Dependencies :devtools(热部 ...
- JavaWeb中监听器+过滤器+拦截器区别、配置和实际应用
JavaWeb中监听器+过滤器+拦截器区别.配置和实际应用 1.前沿上一篇文章提到在web.xml中各个元素的执行顺序是这样的,context-param-->listener-->fil ...
- Springboot关于tomcat容器配置、三大组件配置、拦截器配置
原文地址:http://www.javayihao.top/detail/172 1.tomcat配置 Springboot默认使用的就是嵌入式servlet容器即tomcat,对于web项目,如果使 ...
- springmvc以及springboot中的拦截器配置
拦截器两种实现 如果不同的controller中都需要拦截器,不能使用相同的拦截器,因为拦截器不能跨controller,这个时候只能为不同的controller配置不同的拦截器,每一个拦截器只能 ...
- 在springboot中使用拦截器
在springMVC中可以实现拦截器,是通过实现HandlerInterceptor接口,然后在springmvc-web.xml中配置就可以使用拦截器了.在springboot中拦截器也是一样的思想 ...
- 通过配置http拦截器,来进行ajax请求验证用户登录的页面跳转
在.NET中验证用户是否登录或者是否过期,若需要登录时则将请求转向至登录页面. 这个流程在进行页面请求时是没问题的,能正确进行页面跳转. 然而在使用xmlhttprequest时,或者jq的getJs ...
- spring boot配置springMVC拦截器
spring boot通过配置springMVC拦截器 配置拦截器比较简单, spring boot配置拦截器, 重写preHandle方法. 1.配置拦截器: 2重写方法 这样就实现了拦截器. 其中 ...
- SpringBoot如何添加拦截器
在web开发的过程中,为了实现登录权限验证,我们往往需要添加一个拦截器在用户的的请求到达controller层的时候实现登录验证,那么SpringBoot如何添加拦截器呢? 步骤如下: 1.继承Web ...
- MVC中的过滤器/拦截器怎么写
创建一个AuthenticateFilterAttribute(即过滤器/拦截器) 引用System.Web.Mvc; public class AuthenticateFilterAttribute ...
- SpringMVC配置了拦截器(interceptors)却显示不出css、js样式的解决办法
首先因为在web.xml里面配置了 <filter-mapping> <filter-name>characterEncodingFilter</filter-name& ...
随机推荐
- MySQL学习笔记-SQL实践1
SQL实践1 借着学校的数据库实验,来对之前学习的SQL语言进行实践和总结. 实验环境: macOS 13.2 (22D49) mysql Ver 8.0.32 for macos13.0 on ar ...
- 搜狗五笔 date 自定义时间格式
搜狗五笔 date 自定义时间格式 搜狗五笔 date 默认打出的是"2023-6-15",如果需要"2023-06-15",则需要在自定义短语中设置 属性设置 ...
- Cursor是什么?基于ChatGPT代码编辑器的cursor如何使用?VS Code如何迁移到Cursor的步骤
Cursor是什么 Cursor 是一个基于 Visual Studio Code(VS Code)技术构建的高级代码编辑器,专为提高编程效率并更深度地整合 AI 功能而设计.它不仅继承了 VS Co ...
- 支付宝签名和验签使用JSONObject是最优解。json字符串顺序和==符号都一致演示代码
支付宝签名和验签使用JSONObject是最优解.json字符串顺序和==符号都一致演示代码 支付宝spi接口设计验签和返回结果加签注意点,支付宝使用JSONObject对象https://www.c ...
- 实验四:WinRAR漏洞
[实验目的] 通过打开rar文件,获取到目标机shell. [知识点] winrar漏洞 [实验原理] 该漏洞是由于WinRAR所使用的一个陈旧的动态链接库UNACEV2.dll所造成的,该动态链接库 ...
- Linux内核中的static-key机制
# Linux内核中的static-key机制 背景 在移植某个TP时,发现频繁操作屏幕会导致i2c总线死掉.在跟踪代码的时候,我发现了这个static-key. 因此,学习一下这块的知识. refe ...
- 常见 i2c设备地址
背景 朋友分享的一份i2c器件地址清单,我觉得还不错. reference:https://learn.adafruit.com/i2c-addresses/the-list Special case ...
- shell 根据 指定列 进行 去除 重复行
根据指定列进行去除重复行 这里的重复是指如果两行的某一列数据相同,则认为是重复数据. 例如:第1行与第2行数据,其中的第2列(以- 作为分隔符)明显是重复的. 100069 - ARM Compile ...
- ONNX Runtime入门示例:在C#中使用ResNet50v2进行图像识别
ONNX Runtime简介 ONNX Runtime 是一个跨平台的推理和训练机器学习加速器.ONNX 运行时推理可以实现更快的客户体验和更低的成本,支持来自深度学习框架(如 PyTorch 和 T ...
- Java JVM——11. 执行引擎
1.概述 执行引擎属于JVM的下层,里面包括:解释器.即时编译器.垃圾回收器. 执行引擎是Java虚拟机核心的组成部分之一."虚拟机"是一个相对于"物理机"的概 ...