SpringMVC攔截器的實(shí)現(xiàn)和作用及Redis登陸功能的優(yōu)化詳解
一、分析
項(xiàng)目中添加Spring MVC攔截器,攔截器怎么實(shí)現(xiàn)的,它的作用是什么?
攔截器的作用:讓未登錄的用戶不能訪問(wèn)某些頁(yè)面。 攔截器是在controller代碼執(zhí)行之前,根據(jù)用戶請(qǐng)求做出相應(yīng)的處理;
Spring Boot中的攔截器和Spring MVC中的一樣,流程是:
1、先定義一個(gè)攔截器類,并且這個(gè)類需要實(shí)現(xiàn)HandlerInterceptor接口,重寫接口中的三個(gè)方法:preHandle、postHandler、afterCompletion;
preHandle:此方法在進(jìn)入controller之前執(zhí)行,如果該方法返回ture,則程序繼續(xù)向下執(zhí)行處理器中的方法,否則程序?qū)⒉辉偻吕^續(xù)執(zhí)行;
注意:會(huì)先按照順序執(zhí)行所有攔截器的preHandle方法,一直遇到return false為止,比如第二個(gè)preHandle方法是return false,則第三個(gè)以及以后所有攔截器都不會(huì)執(zhí)行。若都是return true,則執(zhí)行用戶請(qǐng)求的url方法。
postHandler:此方法將在controller執(zhí)行后執(zhí)行;
afterCompletion:此方法在整個(gè)請(qǐng)求結(jié)束(請(qǐng)求結(jié)束,但是并未返回給客戶端)之后執(zhí)行;
2、將攔截器注入到配置類中(Config/WebMvcConfig.java)
配置攔截器,通過(guò)實(shí)現(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:表示需要攔截的資源(即登錄、注冊(cè))
攔截器執(zhí)行流程:
1)單個(gè)攔截器執(zhí)行流程:prehandle()—Handle(也就是控制器里的方法)—postHandle()—afterCompletion()。
2)多個(gè)攔截器執(zhí)行流程:
preHandleA—preHandleC——Handle——postHandleC—postHandleA——afterCompletionC—afterCompletionA。
二、優(yōu)化
項(xiàng)目中使用redis優(yōu)化登錄功能,怎么優(yōu)化?
1、為什么需要使用Redis的原因?
1)使用Redis存儲(chǔ)驗(yàn)證碼kaptcha;
a.驗(yàn)證碼需要頻繁的訪問(wèn)與刷新,對(duì)性能要求比較高;
b.驗(yàn)證碼不需要永久保存,通常在很短的時(shí)間后就會(huì)失效;
c.分布式部署時(shí),存在Session共享問(wèn)題。
Session 是保存在服務(wù)器的?件中,如果是集群服務(wù),同?個(gè)?戶過(guò)來(lái)可能落在不同機(jī)器上,這就會(huì)導(dǎo)致?戶頻繁登陸;采? Redis 保存 Session 后,無(wú)論?戶落在那臺(tái)機(jī)器上都能夠獲取到對(duì)應(yīng)的Session 信息。
2)使用Redis存儲(chǔ)登錄憑證ticket;
a.處理每次請(qǐng)求時(shí),都需要查詢用戶的登錄憑證,訪問(wèn)的頻率非常高。
3)使用Redis緩存用戶信息user。
a.處理每次請(qǐng)求時(shí),都要根據(jù)憑證查詢用戶信息,訪問(wèn)的頻率非常高。
2、為什么Redis速度快、性能好?
(1)數(shù)據(jù)存放在內(nèi)存中:內(nèi)存的讀寫速度比磁盤(數(shù)據(jù)庫(kù))快的多;
(2)數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,對(duì)數(shù)據(jù)操作也簡(jiǎn)單;
(3)采?單線程,沒(méi)有多線程競(jìng)爭(zhēng)鎖的性能消耗,也沒(méi)有多線程導(dǎo)致的切換而消耗CPU, 或者多線程死鎖等問(wèn)題;
(4)使?多路 I/O 復(fù)?模型(解決單線程速度慢的問(wèn)題),?阻塞 IO。
3、之前基于Session的登錄功能怎么使用Redis優(yōu)化?
1)登錄注冊(cè)功能的驗(yàn)證碼之前是存放在Session中,會(huì)增加服務(wù)端的內(nèi)存壓力,現(xiàn)在通過(guò)Cookie獲取信息存儲(chǔ)到Redis中,Redis的key存隨機(jī)字符串,Value存生成的字符串;并且設(shè)置60s后自動(dòng)清理;然后就從redis中獲取驗(yàn)證碼,賦值給kaptcha;
Key值的獲?。?/p>
String kaptchaOwner = CommunityUtil.generateUUID(); String redisKey = RedisKeyUtil.getKaptchaKey(kaptchaOwner);
Key和Value值存儲(chǔ)到Redis中:(其中text是value)
String text = kaptchaProducer.createText(); redisTemplate.opsForValue().set(redisKey, text,60, TimeUnit.SECONDS);
2)使用Redis存儲(chǔ)登錄憑證
String redisKey = RedisKeyUtil.getTicketKey(ticket.getTicket()); redisTemplate.opsForValue().set(redisKey, ticket); map.put("ticket", ticket.getTicket());
3)每次請(qǐng)求,根據(jù)登錄憑證,查詢用戶信息
a.優(yōu)先從緩沖中取值;
b.取不到時(shí)初始化緩沖數(shù)據(jù)(redis存值);
c.數(shù)據(jù)變更時(shí)清除緩存(刪除redis的Key)
到此這篇關(guān)于SpringMVC攔截器的實(shí)現(xiàn)和作用及Redis登陸功能的優(yōu)化詳解的文章就介紹到這了,更多相關(guān)SpringMVC攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中toString()、String.valueOf、(String)強(qiáng)轉(zhuǎn)區(qū)別
相信大家在日常開(kāi)發(fā)中這三種方法用到的應(yīng)該很多,本文主要介紹了Java中toString()、String.valueOf、(String)強(qiáng)轉(zhuǎn)區(qū)別,感興趣的可以了解一下2021-09-09一篇文章了解Jackson注解@JsonFormat及失效解決辦法
這篇文章主要給大家介紹了關(guān)于如何通過(guò)一篇文章了解Jackson注解@JsonFormat及失效解決辦法的相關(guān)資料,@JsonFormat注解是一個(gè)時(shí)間格式化注解,用于格式化時(shí)間,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11JAVA WEB中Servlet和Servlet容器的區(qū)別
這篇文章主要介紹了JAVA WEB中Servlet和Servlet容器的區(qū)別,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06如何使用Java給您的圖片瘦身之Thumbnailator技術(shù)
在java日常開(kāi)發(fā)中經(jīng)常遇到對(duì)圖片資源的操作需求,如壓縮、縮放、旋轉(zhuǎn),下面這篇文章主要給大家介紹了關(guān)于如何使用Java給您的圖片瘦身之Thumbnailator技術(shù)的相關(guān)資料,需要的朋友可以參考下2022-10-10SpringDataJpa的@Query注解報(bào)錯(cuò)的解決
這篇文章主要介紹了SpringDataJpa的@Query注解報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java使用Lambda表達(dá)式查找list集合中是否包含某值問(wèn)題
Java使用Lambda表達(dá)式查找list集合中是否包含某值的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Java實(shí)現(xiàn)多個(gè)wav文件合成一個(gè)的方法示例
這篇文章主要介紹了Java實(shí)現(xiàn)多個(gè)wav文件合成一個(gè)的方法,涉及java文件流讀寫、編碼轉(zhuǎn)換、解析等相關(guān)操作技巧,需要的朋友可以參考下2019-05-05Java?MyBatis實(shí)戰(zhàn)之QueryWrapper中and和or拼接技巧大全
在Java中QueryWrapper是MyBatis-Plus框架中的一個(gè)查詢構(gòu)造器,它提供了豐富的查詢方法,其中包括and和or方法,可以用于構(gòu)建復(fù)雜的查詢條件,這篇文章主要給大家介紹了關(guān)于Java?MyBatis實(shí)戰(zhàn)之QueryWrapper中and和or拼接技巧的相關(guān)資料,需要的朋友可以參考下2024-07-07