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