拦截器概述

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配置过滤器、拦截器的更多相关文章

  1. springboot jsp,过滤器,拦截器

    springboot使用jsp,过滤器,拦截器(拦截器与过滤器区别重点) jsp使用配置 一 创建springboot项目在maven中暂时只添加两个Dependencies :devtools(热部 ...

  2. JavaWeb中监听器+过滤器+拦截器区别、配置和实际应用

    JavaWeb中监听器+过滤器+拦截器区别.配置和实际应用 1.前沿上一篇文章提到在web.xml中各个元素的执行顺序是这样的,context-param-->listener-->fil ...

  3. Springboot关于tomcat容器配置、三大组件配置、拦截器配置

    原文地址:http://www.javayihao.top/detail/172 1.tomcat配置 Springboot默认使用的就是嵌入式servlet容器即tomcat,对于web项目,如果使 ...

  4. springmvc以及springboot中的拦截器配置

    拦截器两种实现   如果不同的controller中都需要拦截器,不能使用相同的拦截器,因为拦截器不能跨controller,这个时候只能为不同的controller配置不同的拦截器,每一个拦截器只能 ...

  5. 在springboot中使用拦截器

    在springMVC中可以实现拦截器,是通过实现HandlerInterceptor接口,然后在springmvc-web.xml中配置就可以使用拦截器了.在springboot中拦截器也是一样的思想 ...

  6. 通过配置http拦截器,来进行ajax请求验证用户登录的页面跳转

    在.NET中验证用户是否登录或者是否过期,若需要登录时则将请求转向至登录页面. 这个流程在进行页面请求时是没问题的,能正确进行页面跳转. 然而在使用xmlhttprequest时,或者jq的getJs ...

  7. spring boot配置springMVC拦截器

    spring boot通过配置springMVC拦截器 配置拦截器比较简单, spring boot配置拦截器, 重写preHandle方法. 1.配置拦截器: 2重写方法 这样就实现了拦截器. 其中 ...

  8. SpringBoot如何添加拦截器

    在web开发的过程中,为了实现登录权限验证,我们往往需要添加一个拦截器在用户的的请求到达controller层的时候实现登录验证,那么SpringBoot如何添加拦截器呢? 步骤如下: 1.继承Web ...

  9. MVC中的过滤器/拦截器怎么写

    创建一个AuthenticateFilterAttribute(即过滤器/拦截器) 引用System.Web.Mvc; public class AuthenticateFilterAttribute ...

  10. SpringMVC配置了拦截器(interceptors)却显示不出css、js样式的解决办法

    首先因为在web.xml里面配置了 <filter-mapping> <filter-name>characterEncodingFilter</filter-name& ...

随机推荐

  1. vue3拉取代码install 报错 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: npm ERR! Found: vue@3.2.31

    先看报错 说明安装的包和现有的包已经冲突了版本不一致 我们先试一下npm install @vue/cli -- force然后再试一下npm install @vue/cli --legacy-pe ...

  2. mongodb基于角色的访问控制

    https://www.mongodb.com/docs/v4.4/tutorial/enable-authentication/ https://www.mongodb.com/docs/manua ...

  3. 聊聊GLM-4-9B开源模型的微调loss计算

    概述 Github官方地址:GLM-4 网上已经有很多关于微调的文章,介绍各种方式下的使用,这里不会赘述.我个人比较关心的是微调时的loss计算逻辑,这点在很多的文章都不会有相关的描述,因为大多数人都 ...

  4. java8 Lambda及Stream学习笔记

    Lambda表达式Lambda 表达式可以替代只有一个抽象函数的接口实现. Lambda表达式同时还提升了对集合.框架的迭代.遍历.过滤数据的操作. Lambda表达式使用场景任何有函数式接口的地方 ...

  5. email邮件(带附件,模拟文件上传,跨服务器)发送核心代码 Couldn't connect to host, port: smtp.163.com, 25; timeout -1;

    邮件(带附件,模拟文件上传,跨服务器)发送核心代码1.测试邮件发送附件接口 /** * 测试邮件发送附件 * @param multipartFile * @return */ @RequestMap ...

  6. 彻底解决IDEA Jrebel 错误找不到口令文件的问题

    本来我的Jrebel也是好用的,突然就变成了这个样子,网上针对这个问题有很多帖子,但是每次新建项目后我都需要去解决一下这个问题,这我不能忍,经过一整天的百度和测试终于找到了原因并解决这个问题,伸手党直 ...

  7. 实验一:Wireshark工具的使用

    1.0 [实验目的] 了解Wireshark.TCP协议的概念,掌握Wireshark抓包工具的使用.FTP的搭建和登录,学会对Wireshark抓包结果的分析. 2.0[知识点] Wireshark ...

  8. 开发工具-eclipse/idea 在运行前执行一些动作

    毫无疑问,我们有的时候想在运行/编译程序前后执行一些动作.eclipse和idea都能支持. 日前正好遇到一个问题:有个依赖于pom的某个jar,内容虽然变了,但是版本不变,所以希望每次执行前先清除特 ...

  9. 【动手学深度学习】第三章笔记:线性回归、SoftMax 回归、交叉熵损失

    这章感觉没什么需要特别记住的东西,感觉忘了回来翻一翻代码就好. 3.1 线性回归 3.1.1 线性回归的基本元素 1. 线性模型 \(\boldsymbol{x}^{(i)}\) 是一个列向量,表示第 ...

  10. openEuler 20.04 TLS3 上的 Python3.11.9 源码一键构建安装

    #! /bin/bash # filename: python-instaler.sh SOURCE_PATH=/usr/local/source # 下载源码包 mkdir -p $SOURCE_P ...