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

Springboot登錄驗證的統(tǒng)一攔截處理的實現(xiàn)

 更新時間:2023年09月22日 09:47:01   作者:IDIOT___IDIOT  
如果不進行統(tǒng)一的攔截處理,每次用戶請求你都要去進行用戶的信息驗證,所以本文主要介紹了Springboot登錄驗證的統(tǒng)一攔截處理的實現(xiàn),感興趣的可以了解一下,感興趣的可以了解一下

在進行Springboot項目開發(fā)的時候如何把每次請求都要驗證的用戶進行提取攔截統(tǒng)一處理

背景

如果不進行統(tǒng)一的攔截處理,其實這是一個非常痛苦的一件事情,因為每次用戶請求你都要去進行用戶的信息(用戶信息存儲在session中)的驗證,代碼重復(fù),所以在本篇提供一個解決方案:

定義一個攔截器,把請求都進行統(tǒng)一的處理,如果Session中存在用戶的信息那么就放行;如果不存在,那么就直接出現(xiàn)異常報錯未登錄。在這樣的一個方案中其實還存在著一個問題,在業(yè)務(wù)邏輯中我要去獲取用戶的信息,那不又是很麻煩了?這里可以通過ThreadLocal解決。

為什么用ThreadLocal:當用戶發(fā)起請求時,會訪問我們像tomcat注冊的端口,任何程序想要運行,都需要有一個線程對當前端口號進行監(jiān)聽,tomcat也不例外,當監(jiān)聽線程知道用戶想要和tomcat連接連接時,那會由監(jiān)聽線程創(chuàng)建socket連接,socket都是成對出現(xiàn)的,用戶通過socket像互相傳遞數(shù)據(jù),當tomcat端的socket接受到數(shù)據(jù)后,此時監(jiān)聽線程會從tomcat的線程池中取出一個線程執(zhí)行用戶請求,在我們的服務(wù)部署到tomcat后,線程會找到用戶想要訪問的工程,然后用這個線程轉(zhuǎn)發(fā)到工程中的controller,service,dao中,并且訪問對應(yīng)的DB,在用戶執(zhí)行完請求后,再統(tǒng)一返回,再找到tomcat端的socket,再將數(shù)據(jù)寫回到用戶端的socket,完成請求和響應(yīng)通過以上講解,我們可以得知 每個用戶其實對應(yīng)都是去找tomcat線程池中的一個線程來完成工作的, 使用完成后再進行回收,既然每個請求都是獨立的,所以在每個用戶去訪問我們的工程時,我們可以使用threadlocal來做到線程隔離,每個線程操作自己的一份數(shù)據(jù)

定義一個ThreadLocal線程工具類

便于對線程內(nèi)部的值進行處理。

public class UserHolder {
    public static final ThreadLocal<User> userThreadLocal = new ThreadLocal<>();
    public static void setValue(User user){
        userThreadLocal.set(user);
    }
    public static User getValue(){
        return userThreadLocal.get();
    }
    public static  void clear(){
        userThreadLocal.remove();
    }
}

定義攔截器

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 獲取 session
        HttpSession session = request.getSession();
        // 檢查用戶是否已登錄
        if (session.getAttribute("user") == null) {
            // 用戶未登錄,進行相關(guān)處理
            throw new BusinessException(ErrorCode.NOT_LOGIN_ERROR);
        }
        // 從 session 中獲取用戶數(shù)據(jù)
        User user = (User) session.getAttribute("user");
        // 將用戶數(shù)據(jù)存儲到 ThreadLocal 中,以便在整個請求周期內(nèi)訪問
        UserHolder.setValue(user);
        // 進行其他邏輯驗證,根據(jù)需求自行添加
        return true; // 允許請求繼續(xù)執(zhí)行
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        // 在請求處理之后執(zhí)行,可以對 ModelAndView 進行修改
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // 在請求完成之后執(zhí)行,用于資源清理等操作
        // 清理 ThreadLocal 中的用戶數(shù)據(jù),防止內(nèi)存泄漏
        UserHolder.clear();
    }
}

讓攔截器生效

通過配置讓攔截器生效

@Configuration
public class MvcConfig implements WebMvcConfigurer {
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加攔截器
        // excludePath 就是排除在外被攔截的路徑
        registry.addInterceptor(new LoginInterceptor())
            	.addPathPatterns("/**")  
                .excludePathPatterns(
                        "/user/login"
                );
    }
}

然后就可以啦

測試

測試Controller

@RestController
@RequestMapping("/user")
public class UserController {
    @Resource
    private UserService userService;
    @PostMapping("/login")
    public BaseResponse<User> login(HttpSession session){
        System.out.println("Hello");
        Random random = new Random(new Date().getTime()) ;
        User user = new User(random.nextLong(), "123","123454","123");
        session.setAttribute("user",user);
        return ResultUtils.success(user);
    }
    @GetMapping("/get")
    public BaseResponse<User> get(){
        return ResultUtils.success(UserHolder.getValue());
    }
}

測試結(jié)果

開始沒有登錄

進行登錄

再次獲取get請求就可以了

這里我出現(xiàn)一個問題我一直調(diào)試了很久,md,就是在配置攔截器的時候添加路徑首先把所有路徑進行攔截,然后放行/user/login就好,我的這個項目在配置文件中給所有的路徑首先加了一個/api這樣的前綴,然后我在攔截路徑的時候都加了api,這個其實是不用加的,直接上路徑就好了,spring自動會加。

到此這篇關(guān)于Springboot登錄驗證的統(tǒng)一攔截處理的實現(xiàn)的文章就介紹到這了,更多相關(guān)Springboot登錄驗證統(tǒng)一攔截處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Netty實現(xiàn)簡易版的RPC框架過程詳解

    Netty實現(xiàn)簡易版的RPC框架過程詳解

    這篇文章主要為大家介紹了Netty實現(xiàn)簡易版的RPC框架過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 解決springboot中@DynamicUpdate注解無效的問題

    解決springboot中@DynamicUpdate注解無效的問題

    這篇文章主要介紹了解決springboot中@DynamicUpdate注解無效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java的Hibernate框架結(jié)合MySQL的入門學習教程

    Java的Hibernate框架結(jié)合MySQL的入門學習教程

    Java世界中的SSH三大框架是Web開發(fā)方面的人氣組合,Hibernate便是其中之一,這里我們來整理一下Java的Hibernate框架結(jié)合MySQL的入門學習教程,需要的朋友可以參考下
    2016-07-07
  • java實現(xiàn)登錄驗證碼

    java實現(xiàn)登錄驗證碼

    這篇文章主要為大家詳細介紹了java實現(xiàn)登錄驗證碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • SpringCloud?Stream?快速入門實例教程

    SpringCloud?Stream?快速入門實例教程

    本文介紹了Spring?Cloud?Stream(SCS)組件在分布式系統(tǒng)中的作用,以及如何集成到Spring?Boot項目中,通過SCS,可以統(tǒng)一管理不同的消息隊列中間件,并提供了更高級的抽象,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • SpringBoot配置加載,各配置文件優(yōu)先級對比方式

    SpringBoot配置加載,各配置文件優(yōu)先級對比方式

    這篇文章主要介紹了SpringBoot配置加載,各配置文件優(yōu)先級對比方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Springboot使用pdfbox提取PDF圖片的代碼示例

    Springboot使用pdfbox提取PDF圖片的代碼示例

    PDFBox是一個用于創(chuàng)建和處理PDF文檔的Java庫,它可以使用Java代碼創(chuàng)建、讀取、修改和提取PDF文檔中的內(nèi)容,本文就給大家介紹Springboot如何使用pdfbox提取PDF圖片,感興趣的同學可以借鑒參考
    2023-06-06
  • Spring 動態(tài)代理實現(xiàn)代碼實例

    Spring 動態(tài)代理實現(xiàn)代碼實例

    這篇文章主要介紹了Spring 動態(tài)代理實現(xiàn)代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • 初識Spring boot監(jiān)控

    初識Spring boot監(jiān)控

    這篇文章主要介紹了spring boot監(jiān)控的相關(guān)知識,文中給大家介紹了查看監(jiān)控數(shù)據(jù),數(shù)據(jù)可視化的相關(guān)知識,需要的朋友可以參考下
    2018-03-03
  • JavaSE實戰(zhàn)之酒店訂房系統(tǒng)的實現(xiàn)

    JavaSE實戰(zhàn)之酒店訂房系統(tǒng)的實現(xiàn)

    這篇文章主要為大家詳細介紹了如何利用JavaSE實現(xiàn)酒店訂房系統(tǒng),文中的示例代碼講解詳細,對我們學習JavaSE開發(fā)有一定的幫助,需要的可以參考一下
    2022-07-07

最新評論

正蓝旗| 开原市| 乌什县| 湖北省| 永州市| 长葛市| 石渠县| 泸西县| 奉贤区| 河北区| 达州市| 南康市| 霞浦县| 兰坪| 龙游县| 桃园县| 钟山县| 新龙县| 驻马店市| 龙江县| 比如县| 织金县| 崇左市| 嘉义县| 金门县| 阿勒泰市| 武功县| 施秉县| 富蕴县| 南通市| 年辖:市辖区| 诸暨市| 三台县| 遂川县| 石屏县| 伽师县| 丽水市| 临沭县| 梨树县| 怀远县| 潍坊市|