SpringMVC攔截器的實現和作用及Redis登陸功能的優化詳解
一、分析
項目中添加Spring MVC攔截器,攔截器怎麼實現的,它的作用是什麼?
攔截器的作用:讓未登錄的用戶不能訪問某些頁面。 攔截器是在controller代碼執行之前,根據用戶請求做出相應的處理;
Spring Boot中的攔截器和Spring MVC中的一樣,流程是:
1、先定義一個攔截器類,並且這個類需要實現HandlerInterceptor接口,重寫接口中的三個方法:preHandle、postHandler、afterCompletion;
preHandle:此方法在進入controller之前執行,如果該方法返回ture,則程序繼續向下執行處理器中的方法,否則程序將不再往下繼續執行;
註意:會先按照順序執行所有攔截器的preHandle方法,一直遇到return false為止,比如第二個preHandle方法是return false,則第三個以及以後所有攔截器都不會執行。若都是return true,則執行用戶請求的url方法。
postHandler:此方法將在controller執行後執行;
afterCompletion:此方法在整個請求結束(請求結束,但是並未返回給客戶端)之後執行;
2、將攔截器註入到配置類中(Config/WebMvcConfig.java)
配置攔截器,通過實現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:表示不攔截的資源(這裡主要是靜態資源:圖片,js、css也屬於靜態資源);
addPathPatterns:表示需要攔截的資源(即登錄、註冊)
攔截器執行流程:
1)單個攔截器執行流程:prehandle()—Handle(也就是控制器裡的方法)—postHandle()—afterCompletion()。
2)多個攔截器執行流程:
preHandleA—preHandleC——Handle——postHandleC—postHandleA——afterCompletionC—afterCompletionA。
二、優化
項目中使用redis優化登錄功能,怎麼優化?
1、為什麼需要使用Redis的原因?
1)使用Redis存儲驗證碼kaptcha;
a.驗證碼需要頻繁的訪問與刷新,對性能要求比較高;
b.驗證碼不需要永久保存,通常在很短的時間後就會失效;
c.分佈式部署時,存在Session共享問題。
Session 是保存在服務器的⽂件中,如果是集群服務,同⼀個⽤戶過來可能落在不同機器上,這就會導致⽤戶頻繁登陸;采⽤ Redis 保存 Session 後,無論⽤戶落在那臺機器上都能夠獲取到對應的Session 信息。
2)使用Redis存儲登錄憑證ticket;
a.處理每次請求時,都需要查詢用戶的登錄憑證,訪問的頻率非常高。
3)使用Redis緩存用戶信息user。
a.處理每次請求時,都要根據憑證查詢用戶信息,訪問的頻率非常高。
2、為什麼Redis速度快、性能好?
(1)數據存放在內存中:內存的讀寫速度比磁盤(數據庫)快的多;
(2)數據結構簡單,對數據操作也簡單;
(3)采⽤單線程,沒有多線程競爭鎖的性能消耗,也沒有多線程導致的切換而消耗CPU, 或者多線程死鎖等問題;
(4)使⽤多路 I/O 復⽤模型(解決單線程速度慢的問題),⾮阻塞 IO。
3、之前基於Session的登錄功能怎麼使用Redis優化?
1)登錄註冊功能的驗證碼之前是存放在Session中,會增加服務端的內存壓力,現在通過Cookie獲取信息存儲到Redis中,Redis的key存隨機字符串,Value存生成的字符串;並且設置60s後自動清理;然後就從redis中獲取驗證碼,賦值給kaptcha;
Key值的獲取:
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)每次請求,根據登錄憑證,查詢用戶信息
a.優先從緩沖中取值;
b.取不到時初始化緩沖數據(redis存值);
c.數據變更時清除緩存(刪除redis的Key)
到此這篇關於SpringMVC攔截器的實現和作用及Redis登陸功能的優化詳解的文章就介紹到這瞭,更多相關SpringMVC攔截器內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- springboot 集成redis哨兵主從的實現
- vue+springboot實現登錄驗證碼
- SpringBoot+SpringSession+Redis實現session共享及唯一登錄示例
- SpringBoot詳解如何整合Redis緩存驗證碼
- redis實現的四種常見限流策略