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