拦截器概述

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. Windows文件管理优化-实用电脑软件(一)

    RX文件管理器 (稀奇古怪的小软件,我推荐,你点赞!) 日后更新涉及:电脑.维护.清理.小工具.手机.APP.IOS.从WEB.到到UI.从开发,设计:诚意寻找伙伴(文编类.技术类.思想类)共编,共进 ...

  2. LeetCode 688. Knight Probability in Chessboard “马”在棋盘上的概率 (C++/Java)

    题目: On an NxN chessboard, a knight starts at the r-th row and c-th column and attempts to make exact ...

  3. 使用 OpenTelemetry 构建可观测性 03 - 导出

    上一个博文中,我提到如何使用 OpenTelemery 的特定语言 API 来收集遥测数据,包含手动和自动的埋点技术,这很重要!但是,收集遥测数据只是解决方案的第一步. 你需要把遥测数据路由转发到其他 ...

  4. 升级babel7后,直接引用element-ui中没有暴露出来的组件image-viewer.vue导致的打包错误

    问题 & 解决方案 升级babel7后,原先代码中像这样直接引用element-ui组件的地方,出现了报错 Module parse failed: Unexpected token (1:0 ...

  5. java多线程编程:你真的了解线程中断吗?

    java.lang.Thread类有一个 interrupt 方法,该方法直接对线程调用.当被interrupt的线程正在sleep或wait时,会抛出 InterruptedException 异常 ...

  6. 内网服务器通过单台外网服务器实现外网访问,iptables NAT

    环境: ​ servera: 外网服务器 ​ serverb: 内网服务器 servera内网网关(GATEWAY)要设置为外网IP,其IP地址作为其它内网服务器的网关 servera 内网网卡配置 ...

  7. EthernetIP IO从站设备数据 转opc ua项目案例

    1 案例说明 设置网关采集EthernetIP IO设备数据 把采集的数据转成opc ua协议转发给其他系统. 2 VFBOX网关工作原理 VFBOX网关是协议转换网关,是把一种协议转换成另外一种协议 ...

  8. 下载 Linux 内核的脚本

    介绍 在 类UNIX 环境下运行比较好(基于wget) 包括了 2.6 ~ 4.x 内核的地址. 5.x 因为 还在更新因此不做记录. 脚本下载地址: https://files.cnblogs.co ...

  9. RK3588J + 麒麟系统,“软硬件”全国产——让您的产品更具竞争力!

    银河麒麟嵌入式操作系统简介 银河麒麟嵌入式操作系统V10是面向物联网及工业互联网场景的安全实时嵌入式操作系统,具备信息安全.多域隔离.云边端协同.多样性算力支持等特点,可满足嵌入式场景对操作系统小型化 ...

  10. IIS部署错误HTTP Error 500.36 ASP.NET Core IIS hosting failure(out-of-process)

    错误提示 HTTP Error 500.36 - ASP.NET Core IIS hosting failure (out-of-process) The out of process reques ...