摘要:一當(dāng)用戶訪問(wèn)一個(gè)系統(tǒng)的時(shí)候,是不存在會(huì)話這種東西的,訪問(wèn)一次就斷開(kāi)和系統(tǒng)之間的連接,這種情況下一般來(lái)說(shuō)需要在后臺(tái)做控制來(lái)維系用戶和系統(tǒng)之間的關(guān)系。
一、What?
當(dāng)用戶訪問(wèn)一個(gè)系統(tǒng)的時(shí)候,是"不存在"會(huì)話這種東西的,訪問(wèn)一次就斷開(kāi)和系統(tǒng)之間的連接,這種情況下一般來(lái)說(shuō)需要在后臺(tái)做控制來(lái)維系用戶和系統(tǒng)之間的關(guān)系。既然Tomcat服務(wù)器做不到,那么可以考慮用redis來(lái)實(shí)現(xiàn)。二、Why? Redis-session的好處
便于拓展,當(dāng)單體應(yīng)用擴(kuò)展成集群會(huì)相當(dāng)方便
便于權(quán)限認(rèn)證
三、How? 1、當(dāng)用戶注冊(cè)或登錄時(shí),保存唯一Token到redis中String uniqueToken = UUID.randomUUID().toString(); redis.set(USER_REDIS_SESSION+":"+userModel.getId(), uniqueToken, 1000 * 60 * 30);2、當(dāng)用戶需要做某些操作時(shí)(比如上傳文件,修改個(gè)人信息等),可以通過(guò)攔截器來(lái)對(duì)用戶做驗(yàn)證
@Autowired public RedisOperator redis; public static final String USER_REDIS_SESSION = "user-redis-session"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String userId = request.getHeader("userId"); String userToken = request.getHeader("userToken"); if(StringUtils.isNoneBlank(userId) && StringUtils.isNoneBlank(userToken)){ String uniqueToken = redis.get(USER_REDIS_SESSION + ":" + userId); if(StringUtils.isEmpty(uniqueToken) && StringUtils.isBlank(uniqueToken)){ //userToken在redis中已過(guò)時(shí),需重新登錄 System.out.println("請(qǐng)登錄。。"); returnErrorResponse(response,IMoocJSONResult.errorTokenMsg("請(qǐng)登錄。。")); return false; }else{ if(!uniqueToken.equals(userToken)){ //userToken被修改了,說(shuō)明有其他人登錄,這里可以控制只能一個(gè)人登錄 System.out.println("賬號(hào)被擠出..."); returnErrorResponse(response,IMoocJSONResult.errorTokenMsg("賬號(hào)被擠出...")); return false; } } }else{ //消息頭沒(méi)有userId和userToken說(shuō)明用戶還未登錄 System.out.println("請(qǐng)登錄。。"); returnErrorResponse(response,IMoocJSONResult.errorTokenMsg("請(qǐng)登錄。。")); return false; } return true; } .......... .......... @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(miniInterceptor()).addPathPatterns("/user/**") .addPathPatterns("/bgm/**") .addPathPatterns("/video/userLike","/video/userUnLike","/video/saveComment") .addPathPatterns("/video/upload","/video/uploadCover") .excludePathPatterns("/user/queryPublisher"); WebMvcConfigurer.super.addInterceptors(registry); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74089.html
摘要:無(wú)狀態(tài)的價(jià)值無(wú)狀態(tài)可以僅用很少的對(duì)象就可以處理很多的用戶,空閑狀態(tài)的用戶越多,無(wú)狀態(tài)服務(wù)器就越有用會(huì)話狀態(tài)相關(guān)性會(huì)話狀態(tài)只與當(dāng)前會(huì)話有關(guān),它存在于業(yè)務(wù)事務(wù)中,與其他會(huì)話及他們的業(yè)務(wù)事務(wù)是分開(kāi)的與記錄數(shù)據(jù)信息的區(qū)別記錄數(shù)據(jù)時(shí)長(zhǎng)期保存在數(shù)據(jù)庫(kù)中 1. 無(wú)狀態(tài)的價(jià)值: 無(wú)狀態(tài)可以僅用很少的對(duì)象就可以處理很多的用戶,空閑狀態(tài)的用戶越多,無(wú)狀態(tài)服務(wù)器就越有用 2. 會(huì)話狀態(tài): 相關(guān)性:會(huì)話狀態(tài)只...
摘要:會(huì)通過(guò)建立起一個(gè)到服務(wù)器的連接通道,當(dāng)本次請(qǐng)求需要的數(shù)據(jù)完畢后,會(huì)立即將連接斷開(kāi),這個(gè)過(guò)程是很短的。這三個(gè)部分以作為分隔符。最后一個(gè)消息頭有兩個(gè),用來(lái)表示消息頭部的結(jié)束。但是這并不代表建立在協(xié)議之上的應(yīng)用程序就無(wú)法維持狀態(tài)。 來(lái)來(lái)來(lái) 對(duì),我就是騙你進(jìn)來(lái)的。嘿嘿嘿... 既然來(lái)了就看看再走嘛 作為一個(gè)學(xué)通信出身的前端,說(shuō)道http、tcp什么的,算是到了我的領(lǐng)域了。(我會(huì)告訴你我上課凈睡...
摘要:背景是一種無(wú)狀態(tài)的協(xié)議,它不對(duì)請(qǐng)求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存,即無(wú)法根據(jù)之前的狀態(tài)進(jìn)行本次請(qǐng)求的處理。為了保留無(wú)狀態(tài)協(xié)議這個(gè)特征的同時(shí)又要解決類似的矛盾問(wèn)題,于是引入了。主要目的是為防止跨站腳本攻擊對(duì)的信息竊取。 需求場(chǎng)景 一個(gè)Vue單頁(yè)應(yīng)用,A、B、C 三個(gè)頁(yè)面都引用了一個(gè)公用的時(shí)間選擇器。用戶在各自頁(yè)面選擇完時(shí)間后,A,B,C頁(yè)面互相切換時(shí)保存選擇的時(shí)間,在關(guān)閉瀏覽器tab后,清...
閱讀 1731·2021-11-22 15:33
閱讀 2109·2021-10-08 10:04
閱讀 3559·2021-08-27 13:12
閱讀 3429·2019-08-30 13:06
閱讀 1479·2019-08-29 16:43
閱讀 1402·2019-08-29 16:40
閱讀 797·2019-08-29 16:15
閱讀 2756·2019-08-29 14:13