Spring Security 使用 OncePerRequestFilter 过滤器校验登录过期、请求日志等操作

 更新时间:2024年06月26日 11:36:54   作者:杜小舟  
OncePerRequestFilter是一个过滤器,每个请求都会执行一次;一般开发中主要是做检查是否已登录、Token是否过期和授权等操作,而每个操作都是一个过滤器,下面介绍Spring Security 使用 OncePerRequestFilter 过滤器校验登录过期、请求日志等操作方法,感兴趣的朋友一起看看吧

前言

OncePerRequestFilter 是一个过滤器,每个请求都会执行一次;一般开发中主要是做检查是否已登录、Token是否过期和授权等操作,而每个操作都是一个过滤器,下面演示一下。

OncePerRequestFilter 使用

检查是否登录过期过滤器

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * 检查是否登录过期
 *
 * @author francis
 * @create: 2023-08-30 16:45
 **/
@Component
@Slf4j
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        log.info("进入 JwtAuthenticationTokenFilter ...");
        /**
         * 从 request 的 header 中拿出来 token
         */
        String token = request.getHeader("token");
        if (token == null || token.isEmpty()) {
            // 没有携带 token 则 放行
            filterChain.doFilter(request, response);
            return;
        }
        /**
         * 检查 token 是否过期逻辑 .....
         */
        // 放行
        filterChain.doFilter(request, response);
    }
}

检查是否登录过期过滤器

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * 请求日志
 *
 * @author francis
 * @create: 2023-08-31 10:15
 **/
@Component
@Slf4j
public class OperationLogFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        log.info("OperationLogFilter ...");
        /**
         * 操作日志记录 ...
         */
        // 放行
        filterChain.doFilter(request, response);
    }
}

SecurityConfiguration 配置

import com.security.filter.JwtAuthenticationTokenFilter;
import com.security.filter.OperationLogFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
/**
 * Security 配置类
 *
 * @author francis
 * @create: 2023-08-30 14:19
 **/
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Autowired
    private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
    @Autowired
    private OperationLogFilter operationLogFilter;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                // 关闭csrf
                .csrf().disable()
                // 不通过 Session 获取 SecurityContext
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                    .authorizeRequests()
                        // 对于登录接口 允许匿名访问
                        .antMatchers("/login")
                            .permitAll()
                        // 除上面外的所有请求全部需要鉴权认证
                        .anyRequest()
                            .authenticated();
        // 在 UsernamePasswordAuthenticationFilter(验证用户) 之前执行
        // TODO 需要注意的是下面过滤器的顺序就是执行的顺序,使用 @Order 也没办法改变
        http
        		// 登录是否过期
                .addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)
                // 请求日志
                .addFilterBefore(operationLogFilter, UsernamePasswordAuthenticationFilter.class);
    }
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

到此这篇关于Spring Security 使用 OncePerRequestFilter 过滤器校验登录过期、请求日志等操作的文章就介绍到这了,更多相关Spring Security OncePerRequestFilter 过滤器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springMVC引入Validation的具体步骤详解

    springMVC引入Validation的具体步骤详解

    本文简单介绍如何引入validation的步骤,如何通过自定义validation减少代码量,提高生产力,非常具有实用价值,需要的朋友可以参考下
    2018-05-05
  • Java中常见的文件拷贝方式小结

    Java中常见的文件拷贝方式小结

    这篇文章主要为大家详细介绍了JAVA 四种拷贝文件的方式,分析一下他们对内存使用的方式和各自应用的场景,其实也是对之前学过的知识做一个回顾吧,快跟随小编一起学习起来吧
    2024-03-03
  • 基于kafka实现Spring Cloud Bus消息总线

    基于kafka实现Spring Cloud Bus消息总线

    消息总线是一种通信工具,可以在机器之间互相传输消息、文件等,这篇文章主要介绍了如何利用kafka实现SpringCloud Bus消息总线,感兴趣的可以学习一下
    2022-04-04
  • tomcat部署java web项目遇到的问题及解决方法

    tomcat部署java web项目遇到的问题及解决方法

    这篇文章主要介绍了tomcat部署java web项目遇到的问题及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • SiteMesh如何结合Freemarker及velocity使用

    SiteMesh如何结合Freemarker及velocity使用

    这篇文章主要介绍了SiteMesh如何结合Freemarker及velocity使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java实战个人博客系统的实现流程

    Java实战个人博客系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+springboot+mybatis+redis+vue+elementui+Mysql实现一个个人博客系统,大家可以在过程中查缺补漏,提升水平
    2022-01-01
  • SpringBoot整合Sa-Token实现登录认证的示例代码

    SpringBoot整合Sa-Token实现登录认证的示例代码

    本文主要介绍了SpringBoot整合Sa-Token实现登录认证的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 详解如何在SpringBoot项目中使用统一返回结果

    详解如何在SpringBoot项目中使用统一返回结果

    在一个完整的项目中,如果每一个控制器的方法都返回不同的结果,那么对项目的维护和扩展都会很麻烦。因此,本文为大家准备了SpringBoot项目中使用统一返回结果的方法,需要的可以参考一下
    2022-10-10
  • SpringBoot集成ECDH密钥交换的方法

    SpringBoot集成ECDH密钥交换的方法

    ECDH密钥交换算法通过椭圆曲线和Diffie-Hellman方法生成共享密钥,用于前端和后端之间的AES加密通信,前端使用elliptic.js生成密钥对,后端使用crypto-js.min.js进行AES加密,本文给大家介绍SpringBoot集成ECDH密钥交换的相关知识,感兴趣的朋友一起看看吧
    2025-01-01
  • RabbitMQ消息拒绝如何解决

    RabbitMQ消息拒绝如何解决

    这篇文章主要介绍了RabbitMQ消息拒绝如何解决问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论