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 过滤器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 内置接口 Serializable示例详解

    Java 内置接口 Serializable示例详解

    这篇文章主要为大家介绍了Java 内置接口 Serializable示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Java5 枚举类详解及实例代码

    Java5 枚举类详解及实例代码

    这篇文章主要介绍了Java5 枚举类详解及实例代码的相关资料,枚举类是java5 新类型,全部都是类型安全的形式表示,需要的朋友可以参考下
    2016-12-12
  • Curator实现zookeeper的节点监听详解

    Curator实现zookeeper的节点监听详解

    这篇文章主要介绍了Curator实现zookeeper的节点监听详解,Curtor框架中一共有三个实现监听的方式,一种是NodeCache监听指定节点,一种是pathChildrenCache监听子节点,一种是TreeCache可以监控所有节点 相当于以上两种的合集,需要的朋友可以参考下
    2023-12-12
  • Java编写的实体返回VO工具

    Java编写的实体返回VO工具

    VO(value object)通常用于业务层之间的数据传递,VO的属性是根据当前业务的不同而不同的,也就是说,它的每一个属性都一一对应当前业务逻辑所需要的数据的名称。本文将介绍如何将实体转换为vo对象
    2021-05-05
  • Java Jwt库的简介及使用详解

    Java Jwt库的简介及使用详解

    JWT 是开放的行业标准RFC7591,用来实现端到端安全验证,就是通过一些算法对加密字符串和JSON对象之间进行加解密,下面通过本文给大家介绍Java Jwt库的简介及使用,感兴趣的朋友一起看看吧
    2021-11-11
  • SpringCloudAlibaba分布式组件详解

    SpringCloudAlibaba分布式组件详解

    这篇文章主要介绍了简单了解Spring Cloud Alibaba分布式组件相关知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-08-08
  • Java中StringBuilder与StringBuffer使用及源码解读

    Java中StringBuilder与StringBuffer使用及源码解读

    我们前面学习的String就属于不可变字符串,因为理论上一个String字符串一旦定义好,其内容就不可再被改变,但实际上,还有另一种可变字符串,包括StringBuilder和StringBuffer两个类,那可变字符串有什么特点,又怎么使用呢,接下来就请大家跟我一起来学习吧
    2023-05-05
  • 图文详解SpringBoot中Log日志的集成

    图文详解SpringBoot中Log日志的集成

    这篇文章主要给大家介绍了关于SpringBoot中Log日志的集成的相关资料,文中通过实例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-12-12
  • SpringBoot实现人脸识别等多种登录方式

    SpringBoot实现人脸识别等多种登录方式

    本文主要介绍了SpringBoot实现人脸识别等多种登录方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 基于Java protected的深入理解

    基于Java protected的深入理解

    本篇文章是对Java protected进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论