首页 > 其他分享 >SpringBoot配置过滤器、拦截器

SpringBoot配置过滤器、拦截器

时间:2023-05-19 14:26:23浏览次数:36  
标签:拦截器 SpringBoot token urls 过滤器 import 请求

拦截器概述

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,token,urls,过滤器,import,请求
From: https://www.cnblogs.com/tanxj/p/17414893.html

相关文章

  • Springboot支持XML格式报文的传输
    导入依赖-jackson-dataformat-xml<!--整合web模块--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions>......
  • SpringBoot 配置统一API对象返回
    1、前言在实际项目开发中,为了便于前端进行响应处理,需要统一返回类格式。特别是在有多个后端开发人员参与的情况下,如果不规范返回类,每个人按照个人习惯返回数据,前端将面临各式各样的返回数据,难以统一处理。为解决这个问题,我们需要规范后端的返回数据,并定义一个统一的返回类,所有数......
  • SpringBoot单元测试只${spring.profiles.active}异常
    在使用SpringBoot进行单元测试时,如果遇到「couldnotresolveplaceholder'spring.profiles.active'」的错误提示,通常是因为你在测试用例中使用了@ActiveProfiles注解来激活某些特定的配置文件,但是你的项目中并没有这些指定的配置文件。为了解决这个问题,你需要检查你的测试......
  • 【小小demo】Springboot + Vue 增删改查
    vue-table-ui该工程提供的是一个简单的Vue+Element-UI的表格,增删改查操作。工程代码在最下面。环境jdk1.8ideamavenspringboot2.1.1.RELEASE示例首页查询新增修改删除官方文档Element-Ui:https://element.eleme.cn/#/zh-CN/component/installationV......
  • Springboot集成Netty实现TCP通讯
    Netty测试客户端packagecom.coremain;importcom.coremain.handler.ServerListenerHandler;importio.netty.bootstrap.Bootstrap;importio.netty.buffer.Unpooled;importio.netty.channel.Channel;importio.netty.channel.ChannelFuture;importio.netty.channel.Cha......
  • springboot项目引入公用项目
    <!--公共interface模块--><dependency><groupId>com.hcp</groupId><artifactId>dubbointerface</artifactId><version>0.0.1-SNAPSHOT</version></depende......
  • Gradle 添加新资源路径,并为资源路径添加过滤器
    今天在学Mybatis的时候遇到了一个小问题,因为.xml文件在main文件夹下,并且Gradle默认的资源路径并不包括main文件夹,所以会出现找不到文件的错误。解决方法:添加资源路径经实测,不需要添加resources文件夹的路径,Gradle始终包含resources文件夹。sourceSets{main......
  • SpringBoot中实现文件上传下载的三种解决方案(推荐)
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • SpringBoot02_Mybatis和配置文件
    关于本文的大体框架在上一篇博客一、SpringBoot整合Mybatis(一)配置文件​ 引入springboot与mybatis整合包以及java-connector<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><versi......
  • 【redis】哨兵监控原理-springboot 监控
    连接序列图解: 连接步骤:1.boot应用启动时,会从yml文件中配置的多个sentinel中抽取一个进行连接,sentinel有单独的账号密码,需要区分sentinel于redis主节点的账号密码,同时需要将连接的主从节点masterName告知sentinel。2.boot应用与sentinel协议并鉴权成功后,sentinel会将第一步......