最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot中實(shí)現(xiàn)全局Token驗(yàn)證的兩種方式總結(jié)

 更新時(shí)間:2025年05月23日 10:29:11   作者:和燁  
這篇文章主要給大家介紹了關(guān)于Spring?Boot中實(shí)現(xiàn)全局Token驗(yàn)證的兩種方式,文中通過攔截器和過濾器實(shí)現(xiàn)全局Token驗(yàn)證,解決接口重復(fù)驗(yàn)證問題,對(duì)比兩者優(yōu)缺點(diǎn)及適用場(chǎng)景,提供統(tǒng)一異常處理方案,需要的朋友可以參考下

前言

在 Spring Boot 項(xiàng)目中,Token 驗(yàn)證是保護(hù)接口安全的常見手段。如果每個(gè)接口都單獨(dú)編寫 Token 驗(yàn)證邏輯,會(huì)導(dǎo)致代碼冗余且難以維護(hù)。為了解決這個(gè)問題,可以通過 攔截器(Interceptor) 或 過濾器(Filter) 實(shí)現(xiàn)全局 Token 驗(yàn)證,從而統(tǒng)一處理所有接口的驗(yàn)證邏輯。

本文將詳細(xì)介紹如何使用攔截器和過濾器實(shí)現(xiàn)全局 Token 驗(yàn)證,并提供完整的代碼示例和最佳實(shí)踐。

一、為什么需要全局 Token 驗(yàn)證?

在前后端分離的架構(gòu)中,客戶端通常通過 Token 進(jìn)行身份驗(yàn)證。如果每個(gè)接口都單獨(dú)驗(yàn)證 Token,會(huì)導(dǎo)致以下問題:

  • 代碼冗余:每個(gè)接口都需要編寫重復(fù)的驗(yàn)證邏輯。
  • 維護(hù)困難:當(dāng)驗(yàn)證邏輯需要修改時(shí),需要修改所有相關(guān)接口。
  • 容易遺漏:新增接口時(shí)可能會(huì)忘記添加驗(yàn)證邏輯,導(dǎo)致安全漏洞。

通過全局 Token 驗(yàn)證,可以統(tǒng)一處理所有接口的驗(yàn)證邏輯,提高代碼的復(fù)用性和可維護(hù)性。

二、使用攔截器實(shí)現(xiàn)全局 Token 驗(yàn)證

攔截器是 Spring MVC 提供的一種機(jī)制,可以在請(qǐng)求到達(dá)控制器之前或之后執(zhí)行特定的邏輯。以下是實(shí)現(xiàn)步驟:

1. 創(chuàng)建 Token 驗(yàn)證攔截器

創(chuàng)建一個(gè)攔截器類,實(shí)現(xiàn) HandlerInterceptor 接口,并在 preHandle 方法中編寫 Token 驗(yàn)證邏輯。

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class TokenInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 從請(qǐng)求頭中獲取 Token
        String token = request.getHeader("Authorization");

        // 驗(yàn)證 Token
        if (token == null || !isValidToken(token)) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401 未授權(quán)
            response.getWriter().write("Token 無效或未提供");
            return false; // 中斷請(qǐng)求
        }

        return true; // 繼續(xù)執(zhí)行請(qǐng)求
    }

    // 模擬 Token 驗(yàn)證邏輯
    private boolean isValidToken(String token) {
        // 這里可以調(diào)用具體的 Token 驗(yàn)證服務(wù)
        return "valid-token".equals(token);
    }
}

2. 注冊(cè)攔截器

將攔截器注冊(cè)到 Spring MVC 中,并配置需要攔截的路徑。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private TokenInterceptor tokenInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 攔截所有路徑
        registry.addInterceptor(tokenInterceptor)
                .addPathPatterns("/**") // 攔截所有接口
                .excludePathPatterns("/login", "/register"); // 排除不需要攔截的路徑
    }
}

3. 測(cè)試攔截器

啟動(dòng)項(xiàng)目后,訪問任意接口時(shí),如果請(qǐng)求頭中沒有提供有效的 Token,則會(huì)返回 401 錯(cuò)誤。

三、使用過濾器實(shí)現(xiàn)全局 Token 驗(yàn)證

過濾器是 Servlet 提供的一種機(jī)制,可以在請(qǐng)求到達(dá) Spring MVC 之前執(zhí)行邏輯。以下是實(shí)現(xiàn)步驟:

1. 創(chuàng)建 Token 驗(yàn)證過濾器

創(chuàng)建一個(gè)過濾器類,實(shí)現(xiàn) Filter 接口,并在 doFilter 方法中編寫 Token 驗(yàn)證邏輯。

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class TokenFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // 從請(qǐng)求頭中獲取 Token
        String token = httpRequest.getHeader("Authorization");

        // 驗(yàn)證 Token
        if (token == null || !isValidToken(token)) {
            httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401 未授權(quán)
            httpResponse.getWriter().write("Token 無效或未提供");
            return; // 中斷請(qǐng)求
        }

        chain.doFilter(request, response); // 繼續(xù)執(zhí)行請(qǐng)求
    }

    // 模擬 Token 驗(yàn)證邏輯
    private boolean isValidToken(String token) {
        // 這里可以調(diào)用具體的 Token 驗(yàn)證服務(wù)
        return "valid-token".equals(token);
    }
}

2. 注冊(cè)過濾器

將過濾器注冊(cè)到 Spring Boot 中,并配置需要攔截的路徑。

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<TokenFilter> tokenFilter() {
        FilterRegistrationBean<TokenFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new TokenFilter());
        registrationBean.addUrlPatterns("/*"); // 攔截所有路徑
        registrationBean.setOrder(1); // 設(shè)置過濾器順序
        return registrationBean;
    }
}

3. 測(cè)試過濾器

啟動(dòng)項(xiàng)目后,訪問任意接口時(shí),如果請(qǐng)求頭中沒有提供有效的 Token,則會(huì)返回 401 錯(cuò)誤。

四、攔截器 vs 過濾器

1. 攔截器的優(yōu)勢(shì)

  • 與 Spring MVC 深度集成,可以訪問 Spring 的上下文和 Bean。
  • 可以精確控制攔截的路徑(通過 addPathPatterns 和 excludePathPatterns)。
  • 適合處理與業(yè)務(wù)邏輯相關(guān)的攔截(如權(quán)限驗(yàn)證、日志記錄)。

2. 過濾器的優(yōu)勢(shì)

  • 更底層,可以攔截所有請(qǐng)求(包括靜態(tài)資源)。
  • 適合處理與 Servlet 相關(guān)的邏輯(如編碼設(shè)置、跨域處理)。

3. 選擇建議

  • 如果需要在 Spring MVC 的上下文中處理邏輯(如依賴注入),優(yōu)先使用攔截器。
  • 如果需要攔截所有請(qǐng)求(包括靜態(tài)資源),或者需要更底層的控制,優(yōu)先使用過濾器。

五、全局異常處理

在攔截器或過濾器中,如果驗(yàn)證失敗,直接返回錯(cuò)誤響應(yīng)可能會(huì)導(dǎo)致客戶端無法解析??梢酝ㄟ^全局異常處理機(jī)制統(tǒng)一返回 JSON 格式的錯(cuò)誤信息。

1. 定義統(tǒng)一響應(yīng)格式

public class ApiResponse {
    private boolean status;
    private int code;
    private String message;

    // 構(gòu)造方法和 Getter/Setter 省略
}

2. 全局異常處理器

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(UnauthorizedException.class)
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    public ApiResponse handleUnauthorizedException(UnauthorizedException e) {
        return new ApiResponse(false, 401, e.getMessage());
    }
}

3. 在攔截器或過濾器中拋出異常

if (token == null || !isValidToken(token)) {
    throw new UnauthorizedException("Token 無效或未提供");
}

六、總結(jié)

通過攔截器或過濾器,可以輕松實(shí)現(xiàn) Spring Boot 項(xiàng)目中所有接口的 Token 驗(yàn)證。以下是兩種方式的對(duì)比:

特性攔截器(Interceptor)過濾器(Filter)
集成方式Spring MVC 集成Servlet 集成
攔截范圍只能攔截 Spring MVC 的請(qǐng)求可以攔截所有請(qǐng)求(包括靜態(tài)資源)
依賴注入支持不支持
適用場(chǎng)景業(yè)務(wù)邏輯相關(guān)的攔截(如權(quán)限驗(yàn)證)底層邏輯相關(guān)的攔截(如編碼設(shè)置)

根據(jù)項(xiàng)目需求選擇合適的方式,并結(jié)合全局異常處理機(jī)制,可以構(gòu)建一個(gè)健壯且易維護(hù)的 Token 驗(yàn)證系統(tǒng)。

到此這篇關(guān)于Spring Boot中實(shí)現(xiàn)全局Token驗(yàn)證兩種方式的文章就介紹到這了,更多相關(guān)SpringBoot全局Token驗(yàn)證方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java分布式事務(wù)的 6 種解決方案

    詳解Java分布式事務(wù)的 6 種解決方案

    在分布式系統(tǒng)、微服務(wù)架構(gòu)大行其道的今天,服務(wù)間互相調(diào)用出現(xiàn)失敗已經(jīng)成為常態(tài),本文側(cè)重于其他幾項(xiàng),關(guān)于 2PC、3PC 傳統(tǒng)事務(wù),網(wǎng)上資料已經(jīng)非常多了,這里不多做重復(fù),本文通過示例給大家介紹Java分布式事務(wù)的 6 種解決方案,一起看看吧
    2021-06-06
  • Spring開發(fā)中自定義注解的使用詳解

    Spring開發(fā)中自定義注解的使用詳解

    這篇文章主要介紹了Spring開發(fā)中自定義注解的使用詳解,在Java項(xiàng)目中,可以自定義注解,方便進(jìn)行某些處理操作,提供開發(fā)效率,需要的朋友可以參考下
    2024-01-01
  • Java?volatile關(guān)鍵字特性講解下篇

    Java?volatile關(guān)鍵字特性講解下篇

    JMM要求保證可見性、原子性、有序性,volatile可以保證其中的兩個(gè),本篇文章具體驗(yàn)證volatile的可見性,不原子性和禁重排,同時(shí)解決volatile的不保證原子性,讓代碼具有原子性
    2022-12-12
  • Java多線程實(shí)現(xiàn)模擬12306火車站售票系統(tǒng)

    Java多線程實(shí)現(xiàn)模擬12306火車站售票系統(tǒng)

    12360火車票售票系統(tǒng)基本上大家都用過,那你知道是怎么實(shí)現(xiàn)的嗎,今天我們就模擬12306火車站售票系統(tǒng)來實(shí)現(xiàn),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 一文詳解Java Netty中的Constant類

    一文詳解Java Netty中的Constant類

    這篇文章主要介紹了Constants類即常量類是將一些常用的變量集合到一個(gè)地方的類,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以參考一下
    2023-05-05
  • java EasyExcel實(shí)現(xiàn)動(dòng)態(tài)列解析和存表

    java EasyExcel實(shí)現(xiàn)動(dòng)態(tài)列解析和存表

    這篇文章主要為大家介紹了java EasyExcel實(shí)現(xiàn)動(dòng)態(tài)列解析和存表示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • SpringMVC事件監(jiān)聽ApplicationListener實(shí)例解析

    SpringMVC事件監(jiān)聽ApplicationListener實(shí)例解析

    這篇文章主要介紹了SpringMVC事件監(jiān)聽ApplicationListener實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • java實(shí)現(xiàn)漢字轉(zhuǎn)unicode與漢字轉(zhuǎn)16進(jìn)制實(shí)例

    java實(shí)現(xiàn)漢字轉(zhuǎn)unicode與漢字轉(zhuǎn)16進(jìn)制實(shí)例

    這篇文章主要介紹了java實(shí)現(xiàn)漢字轉(zhuǎn)unicode與漢字轉(zhuǎn)16進(jìn)制的實(shí)現(xiàn)方法,是Java操作漢字編碼轉(zhuǎn)換的一個(gè)典型應(yīng)用,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • 沒有編輯器的環(huán)境下是如何創(chuàng)建Servlet(Tomcat+Java)項(xiàng)目的?

    沒有編輯器的環(huán)境下是如何創(chuàng)建Servlet(Tomcat+Java)項(xiàng)目的?

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著在沒有編輯器的環(huán)境下如何創(chuàng)建Servlet(Tomcat+Java)項(xiàng)目展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • java中重寫equals()方法的同時(shí)要重寫hashcode()方法(詳解)

    java中重寫equals()方法的同時(shí)要重寫hashcode()方法(詳解)

    下面小編就為大家?guī)硪黄猨ava中重寫equals()方法的同時(shí)要重寫hashcode()方法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05

最新評(píng)論

微博| 锡林浩特市| 马鞍山市| 仁化县| 正宁县| 广昌县| 宜章县| 北宁市| 宣恩县| 玉田县| 富宁县| 唐河县| 宁蒗| 云南省| 曲阜市| 盐边县| 阿坝| 合水县| 尖扎县| 明星| 玉林市| 达尔| 嘉禾县| 佛山市| 定安县| 锦屏县| 遵义县| 凯里市| 云龙县| 临江市| 嘉鱼县| 砀山县| 宝丰县| 分宜县| 阳西县| 宁波市| 济宁市| 抚宁县| 老河口市| 宁乡县| 福州市|