文档章节

Session or Cookie?是否需要用Tomcat等Web容器的Session

FansUnion
 FansUnion
发布于 2015/05/03 01:31
字数 603
阅读 12
收藏 3

Cookie是HTTP协议标准下的存储用户信息的工具,浏览器把用户信息存放到本地的文本文件中。

Session是基于Cookie实现的。


2011年4月,武汉群硕面试的时候(实习生),面试官也问过这个问题。

当时只知道Session是基于Cookie的,但是没有想到“不使用Tomcat等Web容器的Session,只使用Cookie也可以实现自己的Session,完成会话管理,而且据说性能更好。”



以前的做法

   使用HttpRequestSession保存用户信息,非常方便。

   

   配置一个登录拦截器,从Session中获得当前用户的信息。

   

   如果需要登录,但Session中没有用户信息,就强制跳转到登录页;否则,正常执行。

   如果不需要登录,无论Session是否有用户信息,正常执行。

   

   好处:使用自带的Session,编程更方便,不需要额外处理。

   坏处:性能不好,据说Session占居的内存会非常多。

         之前做的Web项目,用户都不大,没有考虑过这个问题。

 

   为了实现“保持登录”这个功能,要用到Cookie,需要做一下特殊处理。

   

   Tomcat的Session可以存放到Redis中,保证服务器重启的情况下,已经登录的用户仍然保持登录。


   把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 

© 著作权归作者所有

FansUnion
粉丝 60
博文 858
码字总数 825464
作品 0
丰台
高级程序员
私信 提问
session机制详解以及session的相关应用

session是web开发里一个重要的概念,在大多数web应用里session都是被当做现成的东西,拿来就直接用,但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求,当碰到这样的情况时候...

凯文加内特
2014/08/08
0
5
Session机制详解以及Session的相关应用

session是web开发里一个重要的概念,在大多数web应用里session都是被当做现成的东西,拿来就直接用,但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求,当碰到这样的情况时候...

天蚕宝衣
2016/07/11
123
0
Tomcat7.0源码分析——Session管理分析(下)

前言   在《Tomcat7.0源码分析——Session管理分析(上)》一文中我介绍了Session、Session管理器,还以StandardManager为例介绍了Session管理器的初始化与启动,本文将接着介绍Session管理...

beliefer
2016/09/30
0
0
Session Cookie ServletContext

Session与Cookie的作用都是为了保持访问用户与后端服务器的交互状态。它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的。例 如,使用Cookie来传...

天蚕宝衣
2016/07/08
84
0
基础图解之分布式服务部署请求流程

今天,深层次和群里同学讨论关于分布式系统问题 汇总如下: 单体应用,分布式部署:保存会话信息(spring-session) 客户端cookies + 服务端 redis = 用户信息 单机应用中,HttpSession是通过Servl...

莫库什勒
04/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot 整合redis

springboot整合redis官方是有文档的: 英文看不懂可以翻译,代码应该看得懂, 这个是自动注入的。当然也可以xml注入,手动配置。 整合步骤: pom文件: <!-- spring boot web --> ...

jason_kiss
20分钟前
0
0
手机耗电问题,大部分是没有正确使用这个“锁”

当安卓设备闲置时,设备很快会进入休眠状态,以达到省电和减少CPU占用的目的。但有些应用在手机灭屏甚至系统休眠时,依然频繁占用CPU处理事件或唤醒屏幕提示用户消息,这类行为会导致手机耗电...

安卓绿色联盟
21分钟前
0
0
UI 设计中的渐变

>**简评:**渐变是通过两种或多种不同的色彩来绘制一个元素,同时在颜色的交界处进行衰减变化的一种设计。从拟物到扁平再到渐变,人们慢慢发现它能创造出从未有过的一种色彩感觉 —— 独特、...

极光推送
26分钟前
0
0
powerdesigner name 转注释vb脚本

Option Explicit ValidationMode = True InteractiveMode = im_BatchDim mdl ' the current model' get the current active model Set mdl = ......

zhu97
31分钟前
1
0
V2Ray的安装与使用

1 1. bash <(curl -s -L https://git.io/v2ray.sh)yum update -y && yum install curl -y安装好 curl 之后就能安装脚本了输入快捷管理命令v2ray后,开始进行v2ray服务端配置...

吕湘颖
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部