关于Session

这几天看了些公司框架代码,主要看了下框架中Session的使用,总结一下。

公司项目是一个客户端项目,做App,前端用了H5加JS,前端用到sea.js框架,后端用到Spring+SpringMVC+Mybatis+PostgreSQL。前端通过Ajax发送请求,SpringMVC接收请求,再传给公司框架处理请求。

工作写业务代码时有一个关于Session的问题是:在一个包含多个请求的业务中,在处理其中某个请求时往Session中存一个对象,在接下来的请求中都能从Session中获取这个对象。

看底层代码是这样写的:每个请求来后,会包装一个Context对象,并在接收到请求后就把请求的Session对象和Context对象放入一个工具类的ThreadLocal对象的Map中,当时一直在想每次请求都会new一个Context对象,并且向ThreadLocal中存一次,为什么可以跨请求取到Session中的值。

上网搜索的时候偶然看到一句话:Session是对浏览器而言的,一个浏览器对应一个Session,然后就想通了。之前背过很多Session特点,现在这些特点活生生出现,竟没反应过来。现再总结下Session。

1.服务器为每个用户浏览器创建一个会话(Session)对象,默认情况下一个浏览器独占一个session对象,Session存在于浏览器窗口打开到关闭这个期间

2.Session是面向连接的,在通信双方在通信之前要先建立一个通信的渠道

3.Session通常是用来在客户端与服务器之间保持状态的解决方案

4.一般情况下session都是存储在内存里

5.Session创建,直到某server端程序调用HttpServletRequest.getSession(true)这样的语句时Session才被创建

6.Session中对象可序列化是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存

以上参考文章:http://justsee.iteye.com/blog/1570652

关于Session和ThreadLocal的关系:

我们一般使用ThreadLocal的模式是将该ThreadLocal对象作为一个类的静态变量(解决同一线程跨类跨方法访问的问题),先Set再Get,以两个Request与Thread的不同关系来说。假如这两个Request属于两个Thread则不存在问题,假如两个Request属于一个Thread,那么Request A在执行过程中先Set一个值,后再Get的是自己Set的值。Request B在执行过程中先Set一个值,此时Set的值将覆盖之前Request A已经Set的值(因为ThreadLocal的机制是在每一个线程内部以TheadLocal对象作为Key来存值,现在key没变,又塞了一个新值,所以会覆盖旧值),后Get的将是Request B的值。

摘自:http://blog.csdn.net/chenbo19867758/article/details/51501554

为了提高处理效率,Tomcat和Jetty均使用react模式多线程的处理http请求。而一个处理线程会包含一个request和response对象。当请求发起时,request对象装载请求参数,当请求返回时,response输出缓冲区的数据,request则清空其加载的参数,然后等待处理下一次请求。换句话说,只要这个处理线程存在,这两个对象永远为null,更不会被垃圾回收机制处理。servlet规范中,要求每个request和response对象只能在servlet的service方法中有效,但是同时也允许容器重复使用这些对象。

摘自:http://blog.csdn.net/csluanbin/article/details/50930138

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值