欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringMVC攔截器的實現(xiàn)和作用及Redis登陸功能的優(yōu)化詳解

 更新時間:2022年09月19日 16:20:14   作者:π大星的日常  
這篇文章主要介紹了Java項目SpringMVC攔截器+Redis優(yōu)化登錄功能實現(xiàn)過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧

一、分析

項目中添加Spring MVC攔截器,攔截器怎么實現(xiàn)的,它的作用是什么?

攔截器的作用:讓未登錄的用戶不能訪問某些頁面。 攔截器是在controller代碼執(zhí)行之前,根據(jù)用戶請求做出相應的處理;

Spring Boot中的攔截器和Spring MVC中的一樣,流程是:

1、先定義一個攔截器類,并且這個類需要實現(xiàn)HandlerInterceptor接口,重寫接口中的三個方法:preHandle、postHandler、afterCompletion;

preHandle:此方法在進入controller之前執(zhí)行,如果該方法返回ture,則程序繼續(xù)向下執(zhí)行處理器中的方法,否則程序將不再往下繼續(xù)執(zhí)行;

注意:會先按照順序執(zhí)行所有攔截器的preHandle方法,一直遇到return false為止,比如第二個preHandle方法是return false,則第三個以及以后所有攔截器都不會執(zhí)行。若都是return true,則執(zhí)行用戶請求的url方法。

postHandler:此方法將在controller執(zhí)行后執(zhí)行;

afterCompletion:此方法在整個請求結束(請求結束,但是并未返回給客戶端)之后執(zhí)行;

2、將攔截器注入到配置類中(Config/WebMvcConfig.java)

配置攔截器,通過實現(xiàn)WebMvcConfigurer接口,重寫addInterceptors方法,具體代碼如下:

public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(alphaInterceptor)
.excludePathPatterns("/**/*.css", "/**/*.js", "/**/*.png", "/**/*.jpg", "/**/*.jpeg")
.addPathPatterns("/register", "/login");}}

excludePathPatterns:表示不攔截的資源(這里主要是靜態(tài)資源:圖片,js、css也屬于靜態(tài)資源);

addPathPatterns:表示需要攔截的資源(即登錄、注冊)

攔截器執(zhí)行流程:

1)單個攔截器執(zhí)行流程:prehandle()—Handle(也就是控制器里的方法)—postHandle()—afterCompletion()。

2)多個攔截器執(zhí)行流程:

preHandleA—preHandleC——Handle——postHandleC—postHandleA——afterCompletionC—afterCompletionA。

二、優(yōu)化

項目中使用redis優(yōu)化登錄功能,怎么優(yōu)化?

1、為什么需要使用Redis的原因?

1)使用Redis存儲驗證碼kaptcha;

a.驗證碼需要頻繁的訪問與刷新,對性能要求比較高;

b.驗證碼不需要永久保存,通常在很短的時間后就會失效;

c.分布式部署時,存在Session共享問題。

Session 是保存在服務器的?件中,如果是集群服務,同?個?戶過來可能落在不同機器上,這就會導致?戶頻繁登陸;采? Redis 保存 Session 后,無論?戶落在那臺機器上都能夠獲取到對應的Session 信息。

2)使用Redis存儲登錄憑證ticket;

a.處理每次請求時,都需要查詢用戶的登錄憑證,訪問的頻率非常高。

3)使用Redis緩存用戶信息user。

a.處理每次請求時,都要根據(jù)憑證查詢用戶信息,訪問的頻率非常高。

2、為什么Redis速度快、性能好?

(1)數(shù)據(jù)存放在內(nèi)存中:內(nèi)存的讀寫速度比磁盤(數(shù)據(jù)庫)快的多;

(2)數(shù)據(jù)結構簡單,對數(shù)據(jù)操作也簡單;

(3)采?單線程,沒有多線程競爭鎖的性能消耗,也沒有多線程導致的切換而消耗CPU, 或者多線程死鎖等問題;

(4)使?多路 I/O 復?模型(解決單線程速度慢的問題),?阻塞 IO。

3、之前基于Session的登錄功能怎么使用Redis優(yōu)化?

1)登錄注冊功能的驗證碼之前是存放在Session中,會增加服務端的內(nèi)存壓力,現(xiàn)在通過Cookie獲取信息存儲到Redis中,Redis的key存隨機字符串,Value存生成的字符串;并且設置60s后自動清理;然后就從redis中獲取驗證碼,賦值給kaptcha;

Key值的獲?。?/p>

String kaptchaOwner = CommunityUtil.generateUUID();
String redisKey = RedisKeyUtil.getKaptchaKey(kaptchaOwner);

Key和Value值存儲到Redis中:(其中text是value)

String text = kaptchaProducer.createText();
redisTemplate.opsForValue().set(redisKey, text,60, TimeUnit.SECONDS);

2)使用Redis存儲登錄憑證

String redisKey = RedisKeyUtil.getTicketKey(ticket.getTicket());     
redisTemplate.opsForValue().set(redisKey, ticket);        
map.put("ticket", ticket.getTicket());

3)每次請求,根據(jù)登錄憑證,查詢用戶信息

a.優(yōu)先從緩沖中取值;

b.取不到時初始化緩沖數(shù)據(jù)(redis存值);

c.數(shù)據(jù)變更時清除緩存(刪除redis的Key)

到此這篇關于SpringMVC攔截器的實現(xiàn)和作用及Redis登陸功能的優(yōu)化詳解的文章就介紹到這了,更多相關SpringMVC攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

  • Java中toString()、String.valueOf、(String)強轉區(qū)別

    Java中toString()、String.valueOf、(String)強轉區(qū)別

    相信大家在日常開發(fā)中這三種方法用到的應該很多,本文主要介紹了Java中toString()、String.valueOf、(String)強轉區(qū)別,感興趣的可以了解一下
    2021-09-09
  • 一篇文章了解Jackson注解@JsonFormat及失效解決辦法

    一篇文章了解Jackson注解@JsonFormat及失效解決辦法

    這篇文章主要給大家介紹了關于如何通過一篇文章了解Jackson注解@JsonFormat及失效解決辦法的相關資料,@JsonFormat注解是一個時間格式化注解,用于格式化時間,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • JAVA WEB中Servlet和Servlet容器的區(qū)別

    JAVA WEB中Servlet和Servlet容器的區(qū)別

    這篇文章主要介紹了JAVA WEB中Servlet和Servlet容器的區(qū)別,文中示例代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解下
    2020-06-06
  • 如何使用Java給您的圖片瘦身之Thumbnailator技術

    如何使用Java給您的圖片瘦身之Thumbnailator技術

    在java日常開發(fā)中經(jīng)常遇到對圖片資源的操作需求,如壓縮、縮放、旋轉,下面這篇文章主要給大家介紹了關于如何使用Java給您的圖片瘦身之Thumbnailator技術的相關資料,需要的朋友可以參考下
    2022-10-10
  • SpringDataJpa的@Query注解報錯的解決

    SpringDataJpa的@Query注解報錯的解決

    這篇文章主要介紹了SpringDataJpa的@Query注解報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java使用Lambda表達式查找list集合中是否包含某值問題

    Java使用Lambda表達式查找list集合中是否包含某值問題

    Java使用Lambda表達式查找list集合中是否包含某值的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java實現(xiàn)多個wav文件合成一個的方法示例

    Java實現(xiàn)多個wav文件合成一個的方法示例

    這篇文章主要介紹了Java實現(xiàn)多個wav文件合成一個的方法,涉及java文件流讀寫、編碼轉換、解析等相關操作技巧,需要的朋友可以參考下
    2019-05-05
  • Java?MyBatis實戰(zhàn)之QueryWrapper中and和or拼接技巧大全

    Java?MyBatis實戰(zhàn)之QueryWrapper中and和or拼接技巧大全

    在Java中QueryWrapper是MyBatis-Plus框架中的一個查詢構造器,它提供了豐富的查詢方法,其中包括and和or方法,可以用于構建復雜的查詢條件,這篇文章主要給大家介紹了關于Java?MyBatis實戰(zhàn)之QueryWrapper中and和or拼接技巧的相關資料,需要的朋友可以參考下
    2024-07-07
  • Java使用遞歸法解決漢諾塔問題的代碼示例

    Java使用遞歸法解決漢諾塔問題的代碼示例

    這篇文章主要介紹了Java使用遞歸法解決漢諾塔問題的代碼示例,漢諾塔問題是使用遞歸解決問題的經(jīng)典范例,用到的算法非常簡單,需要的朋友可以參考下
    2016-04-04
  • 最新評論