Spring Security 使用 OncePerRequestFilter 過(guò)濾器校驗(yàn)登錄過(guò)期、請(qǐng)求日志等操作
前言
OncePerRequestFilter 是一個(gè)過(guò)濾器,每個(gè)請(qǐng)求都會(huì)執(zhí)行一次;一般開(kāi)發(fā)中主要是做檢查是否已登錄、Token是否過(guò)期和授權(quán)等操作,而每個(gè)操作都是一個(gè)過(guò)濾器,下面演示一下。
OncePerRequestFilter 使用
檢查是否登錄過(guò)期過(guò)濾器
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;
/**
* 檢查是否登錄過(guò)期
*
* @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("進(jìn)入 JwtAuthenticationTokenFilter ...");
/**
* 從 request 的 header 中拿出來(lái) token
*/
String token = request.getHeader("token");
if (token == null || token.isEmpty()) {
// 沒(méi)有攜帶 token 則 放行
filterChain.doFilter(request, response);
return;
}
/**
* 檢查 token 是否過(guò)期邏輯 .....
*/
// 放行
filterChain.doFilter(request, response);
}
}檢查是否登錄過(guò)期過(guò)濾器
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;
/**
* 請(qǐng)求日志
*
* @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
// 關(guān)閉csrf
.csrf().disable()
// 不通過(guò) Session 獲取 SecurityContext
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
// 對(duì)于登錄接口 允許匿名訪問(wèn)
.antMatchers("/login")
.permitAll()
// 除上面外的所有請(qǐng)求全部需要鑒權(quán)認(rèn)證
.anyRequest()
.authenticated();
// 在 UsernamePasswordAuthenticationFilter(驗(yàn)證用戶) 之前執(zhí)行
// TODO 需要注意的是下面過(guò)濾器的順序就是執(zhí)行的順序,使用 @Order 也沒(méi)辦法改變
http
// 登錄是否過(guò)期
.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)
// 請(qǐng)求日志
.addFilterBefore(operationLogFilter, UsernamePasswordAuthenticationFilter.class);
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}到此這篇關(guān)于Spring Security 使用 OncePerRequestFilter 過(guò)濾器校驗(yàn)登錄過(guò)期、請(qǐng)求日志等操作的文章就介紹到這了,更多相關(guān)Spring Security OncePerRequestFilter 過(guò)濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PowerJob的AliOssService工作流程源碼解讀
這篇文章主要介紹了PowerJob的AliOssServiceg工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
SpringBoot YAML語(yǔ)法基礎(chǔ)詳細(xì)整理
YAML 是 “YAML Ain’t Markup Language”(YAML 不是一種標(biāo)記語(yǔ)言)的遞歸縮寫(xiě)。在開(kāi)發(fā)的這種語(yǔ)言時(shí),YAML 的意思其實(shí)是:“Yet Another Markup Language”(仍是一種標(biāo)記語(yǔ)言),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10
maven項(xiàng)目install時(shí)忽略執(zhí)行test方法的總結(jié)
這篇文章主要介紹了maven項(xiàng)目install時(shí)忽略執(zhí)行test方法的總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
JVM 方法調(diào)用之動(dòng)態(tài)分派(詳解)
下面小編就為大家?guī)?lái)一篇JVM 方法調(diào)用之動(dòng)態(tài)分派(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
Spring?Cloud?Gateway實(shí)現(xiàn)零拷貝參數(shù)校驗(yàn)的完整指南
本文將深入探討在?Spring?Cloud?Gateway?中實(shí)現(xiàn)零拷貝參數(shù)校驗(yàn)的完整方案,從問(wèn)題背景、設(shè)計(jì)思路到具體實(shí)現(xiàn),提供可落地的實(shí)踐指導(dǎo),需要的朋友可以參考下2026-04-04
Spring Cloud Data Flow初體驗(yàn)以Local模式運(yùn)行
這篇文章主要介紹了Spring Cloud Data Flow初體驗(yàn)以Local模式運(yùn)行,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
Springboot項(xiàng)目中使用EasyPOI操作Excel的詳細(xì)教程
EasyPOI簡(jiǎn)介:EasyPOI是一款用于簡(jiǎn)化POI開(kāi)發(fā)的類庫(kù),它提供了Excel、CSV、Word的快速導(dǎo)入導(dǎo)出功能,文章詳細(xì)介紹了如何使用EasyPOI進(jìn)行注解方式導(dǎo)出和導(dǎo)入Excel,以及模板方式導(dǎo)出Excel,同時(shí),還簡(jiǎn)要介紹了CSV的導(dǎo)出方式2026-01-01

