Spring Security 使用 OncePerRequestFilter 過濾器校驗(yàn)登錄過期、請求日志等操作
前言
OncePerRequestFilter 是一個過濾器,每個請求都會執(zhí)行一次;一般開發(fā)中主要是做檢查是否已登錄、Token是否過期和授權(quán)等操作,而每個操作都是一個過濾器,下面演示一下。
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("進(jìn)入 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
// 關(guān)閉csrf
.csrf().disable()
// 不通過 Session 獲取 SecurityContext
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
// 對于登錄接口 允許匿名訪問
.antMatchers("/login")
.permitAll()
// 除上面外的所有請求全部需要鑒權(quán)認(rèn)證
.anyRequest()
.authenticated();
// 在 UsernamePasswordAuthenticationFilter(驗(yàn)證用戶) 之前執(zhí)行
// TODO 需要注意的是下面過濾器的順序就是執(zhí)行的順序,使用 @Order 也沒辦法改變
http
// 登錄是否過期
.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)
// 請求日志
.addFilterBefore(operationLogFilter, UsernamePasswordAuthenticationFilter.class);
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}到此這篇關(guān)于Spring Security 使用 OncePerRequestFilter 過濾器校驗(yàn)登錄過期、請求日志等操作的文章就介紹到這了,更多相關(guān)Spring Security OncePerRequestFilter 過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于kafka實(shí)現(xiàn)Spring Cloud Bus消息總線
消息總線是一種通信工具,可以在機(jī)器之間互相傳輸消息、文件等,這篇文章主要介紹了如何利用kafka實(shí)現(xiàn)SpringCloud Bus消息總線,感興趣的可以學(xué)習(xí)一下2022-04-04
SiteMesh如何結(jié)合Freemarker及velocity使用
這篇文章主要介紹了SiteMesh如何結(jié)合Freemarker及velocity使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10
Java實(shí)戰(zhàn)個人博客系統(tǒng)的實(shí)現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+springboot+mybatis+redis+vue+elementui+Mysql實(shí)現(xiàn)一個個人博客系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2022-01-01
SpringBoot整合Sa-Token實(shí)現(xiàn)登錄認(rèn)證的示例代碼
本文主要介紹了SpringBoot整合Sa-Token實(shí)現(xiàn)登錄認(rèn)證的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
詳解如何在SpringBoot項目中使用統(tǒng)一返回結(jié)果
在一個完整的項目中,如果每一個控制器的方法都返回不同的結(jié)果,那么對項目的維護(hù)和擴(kuò)展都會很麻煩。因此,本文為大家準(zhǔn)備了SpringBoot項目中使用統(tǒng)一返回結(jié)果的方法,需要的可以參考一下2022-10-10

