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