Session or Cookie?是否有必要使用Tomcat等一下Web集装箱Session
Cookie是HTTP協(xié)議標(biāo)準(zhǔn)下的存儲(chǔ)用戶信息的工具。瀏覽器把用戶信息存放到本地的文本文件里。
Session是基于Cookie實(shí)現(xiàn)的。
2011年4月,武漢群碩面試的時(shí)候(實(shí)習(xí)生)。面試官也問(wèn)過(guò)這個(gè)問(wèn)題。
當(dāng)時(shí)僅僅知道Session是基于Cookie的。可是沒(méi)有想到“不使用Tomcat等Web容器的Session,僅僅使用Cookie也能夠?qū)崿F(xiàn)自己的Session。完畢會(huì)話管理,并且據(jù)說(shuō)性能更好。”
曾經(jīng)的做法:
? ?使用HttpRequestSession保存用戶信息,很方便。
? ?
? ?配置一個(gè)登錄攔截器,從Session中獲得當(dāng)前用戶的信息。
? ?
? ?假設(shè)須要登錄,但Session中沒(méi)實(shí)用戶信息,就強(qiáng)制跳轉(zhuǎn)到登錄頁(yè)。否則,正常運(yùn)行。
? ?假設(shè)不須要登錄,不管Session是否實(shí)用戶信息,正常運(yùn)行。
? ?
? ?優(yōu)點(diǎn):使用自帶的Session。編程更方便,不須要額外處理。
? ?壞處:性能不好。據(jù)說(shuō)Session占居的內(nèi)存會(huì)許多。
? ? ? ? ?之前做的Web項(xiàng)目。用戶都不大,沒(méi)有考慮過(guò)這個(gè)問(wèn)題。
?
? ?為了實(shí)現(xiàn)“保持登錄”這個(gè)功能,要用到Cookie,須要做一下特殊處理。
? ?
? ?Tomcat的Session能夠存放到Redis中。保證server重新啟動(dòng)的情況下。已經(jīng)登錄的用戶仍然保持登錄。
? ?把Java的Session存到Redis。這個(gè)還沒(méi)有實(shí)現(xiàn)過(guò)。
創(chuàng)業(yè)的做法:
? ?創(chuàng)業(yè)做ITFriend的時(shí)候,我們是把Node.js的Session數(shù)據(jù)存到Redis中。
? ?
? ?
如今的做法:
? ?不使用HttpRequestSession,使用Cookie,在用戶端保存key。用戶信息緩存到Redis中。
每次請(qǐng)求來(lái)的時(shí)候,依據(jù)Cookie信息。得到key,依據(jù)緩存,推斷用戶是否登錄過(guò)。
? ?
?
? ?配置一個(gè)登錄攔截器,默認(rèn)須要登錄。使用@LoginNeedless注解,就不須要登錄。不管是否登錄,都能夠把用戶的信息放到線程上下文ThreadLocal<User>中。
? ?
? ?
? 在實(shí)際過(guò)程中。發(fā)現(xiàn)一個(gè)問(wèn)題。ThreadLocal<User>是線程局部變量,可是Tomcat的線程是“線程池” 實(shí)現(xiàn)的,兩個(gè)不同用戶的ThreadLocal可能是同一個(gè),
? 因此在請(qǐng)求和開(kāi)始的時(shí)候,清空用戶信息: LoginUtil.setCurrentUser(null);
? 防止不同用戶的數(shù)據(jù)互相干擾。
??
? 理論上的性能排序:
? Cookie+Redis >= 容器Session+Redis > 容器Session
原文首發(fā):http://fansunion.cn/article/detail/56.html?
版權(quán)聲明:本文博主原創(chuàng)文章,博客,未經(jīng)同意不得轉(zhuǎn)載。
轉(zhuǎn)載于:https://www.cnblogs.com/zfyouxi/p/4799019.html
總結(jié)
以上是生活随笔為你收集整理的Session or Cookie?是否有必要使用Tomcat等一下Web集装箱Session的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IOS第二天多线程-04简化单例模式
- 下一篇: Lichee (六) 优化配置的微内核