拦截器概述

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. kubernetes(k8s)

    应用程序部署的演变过程 在部署应用程序的方式上,主要经历了三个时代 传统部署 互联网早期,会直接将应用程序部署在物理机上 优点: 简单,不需要其他技术的参与 缺点: 不能为应用程序定义资源使用边界,很 ...

  2. Github 如何查看自己的 star 和 fork

    最近在 github 上看到偶尔有几个项目被 fork,心里也是挺开心的,但是查看项目的 fork 和 star,网上没有一个具体的教程,都是一个模板各种抄,本文就详细介绍如何查看. 查看 fork ...

  3. TypeScript keyof

    keyof 是 TypeScript 中的一个关键字,用于获取一个类型的所有键(属性名)构成的联合类型.它主要用于在类型系统中引用对象类型的键. 以下是一些 keyof 的用法和示例: 1. 获取对象 ...

  4. 模拟登录之web监控

    1.什么是web监控 zabbix除了能通过 脚本+自定义key,实现服务器数据提取监控以外 也支持对网页的HTTP请求.响应监控. 2.web监控需求 以zabbix-UI页面的登录监控,模拟登录, ...

  5. 订单请求接口设计,避免timeout超时问题 下单解决

    订单请求接口设计,避免timeout超时问题 下单解决 接上篇:外部系统对接下单幂等性校验逻辑及接口超时处理 https://www.cnblogs.com/oktokeep/p/17668039.h ...

  6. http请求方式-CloseableHttpClient

    http请求方式-CloseableHttpClient import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObjec ...

  7. 如何更改.NET中的默认时区?

    除了"在操作系统中修改时区信息,然后重启.NET应用程序,使其生效"之外.如何在不修改操作系统时区的前提下,修改.NET中的默认时区呢? 这是一位 同学兼同事 于5月21日在技术群 ...

  8. spark使用jdbc批次提交方式写入phoniex的工具类

    一.需求:spark写入phoniex 二.实现方式 1.官网方式 dataFrame.write .format("org.apache.phoenix.spark") .mod ...

  9. 关于 Jupyter Nbconvert 自定义 LaTeX 模板,中文兼容与格式设置,从 Notebook 构建 LaTeX PDF 文档

    目录 为什么会有这篇随笔的内容? 简述一下我遇到的问题 Nbconvert 转换 .ipynb 文件的基本方法 Jupyter Nbconvert 构建中文 \(\LaTeX\) 文档的痛点 Jupy ...

  10. detect.py - yolov5master nvidia jetson agx xavier for mask with UART

    import argparse import time from pathlib import Path import cv2 import torch import torch.backends.c ...