专栏首页JavaQ复习Session,看这一篇就够了

复习Session,看这一篇就够了

在网络应用中,Session对象存储特定用户会话所需的属性及配置信息,实现会话保持和跟踪,本文将详细总结Session相关的知识点。

session概述

HTTP协议是一种无状态的协议,用户通过浏览器访问服务端的每次请求都是相互独立的,服务端无法直接通过HTTP请求来判断上次请求的用户和本次请求的用户是否是同一人,当然,你可以使用Cookie来传递用户状态的标识,但是每次发起请求都必须来回传递这些Cookie数据,为了实现更多的状态跟踪,传递的Cookie数据会越来越多,这无形中增加了浏览器与服务端的数据传输的压力和复杂性,Cookie的大小不仅有限制,而且这种方式是不安全的,容易被盗取和篡改,然而session的出现正解决了这些问题。session是存储于服务端的、用于记录和保持某些状态的一种会话跟踪技术。用户通过浏览器发起请求的时候,不用每次都回传所有的Cookie值了,只要回传一个key-value的键值对就可以了,一般情况下这个key为JSESIONID,value为客户端第一次访问服务端时生成的唯一值,这个value可以标识和跟踪用户的会话信息,这个value在服务端被习惯称作sessionId。

如何传递sessionId

客户端可以通过以下三种方式将JSESSIONID的key-value键值对传递到服务端。

  1. 如果用户浏览器不支持Cookie或Cookie被禁止了,浏览器将会把这个key-value键值对重写到请求的URL参数中,重写的格式如/xxx/path/abcAction;key=value?paramName=paramValue,其中的key-value就是要传递的参数。服务端接收到请求后,会从URL中取到这个key对应的value,并将这个value设置到request,具体的代码是request.setRequestedSessionId。
  2. 如果浏览器支持Cookie,则浏览器在发请求的时候将会在Request Headers中设置key-value的请求参数,服务端接收到请求后,将会取出这个value值,同时这个value值会覆盖掉从URL中取得的值。
  3. 基于SSL,默认情况下不支持,只有connector.getAttribute("SSLEnabled")为true时才支持。

如何保持session会话

正常情况下,用户第一次通过浏览器请求服务端的时候是没有value的,此时服务端会通过request.getSession()方法创建一个HttpSession对象,并给它设置一个有效期,然后将这个对象存储在sessions的容器中,同时会把sessionId返回给浏览器端。如果用户再次发起请求,服务端在解析得到sessionId后,会判断sessionId对应的HttpSession是否存在,如果不存在,会创建一个HttpSession对象,并将这个对象存储在sessions的容器中,同时会把sessionId返回给浏览器端;如果存在,将可以得到对应的HttpSession对象,这个HttpSession对象可以存储很多状态或表示数据,如session.setAttribute(),从而实现会话跟踪。

session对象都有一个有效期,一般情况下,应用容器都会有一个后台线程用于检查每个session是否失效,如果失效将会被清除。而值得注意的是,调用request.getSession()时会检查对应的session对象是否过期,如果过期将会创建一个新session对象。

在应用容器重启或关闭的时候,未过期的session对象会被持久化到一个SESSIONS.ser文件中,当应用容器再次启动的时候,会重新读取SESSIONS.ser中所有未过期的session对象,并将它们存储到sessions集合中。一个应用服务器存储一套session数据。

本文分享自微信公众号 - JavaQ(Java-Q),作者:wind瑞

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 玩转Spring,行家的视频课程

    毋庸置疑,Spring早已成为Java后端开发事实上的行业标准,无数的公司选择Spring作为基础的开发框架,大部分Java后端程序员在日常工作中也会接触到Sp...

    JavaQ
  • 写这样的方法让人很反感

    写作文要做到段落清晰、每段思路流畅、每段主旨明确,要有一条清晰的线穿插整篇内容,编写程序代码和写作文是一个套路。一个类就像一篇小作文,类的单一职责就是小作文要叙...

    JavaQ
  • 深入Spring Boot2.0汇总

    Spring Boot2.0的内容有很多,要深入的还有很多,后续还会挤时间做更新,把已经写好的内容整理一下,做了汇总方便查看。 目 录 深入Spring Boo...

    JavaQ
  • 性能优化总结(五):CSLA服务端如何使用多线程的解决方案

        前篇说到了使用异步线程来实现数据的预加载,以提高系统性能。     这样的操作一般是在客户端执行,用以减少用户的等待时间。客户端发送多次异步请求,到达服...

    用户1172223
  • nodejs作为前后端分离中间件的跨域解决方案

    前后端分离时候SEO问题很头疼,上次提供了nuxt+axios解决服务端渲染问题的解决方案,其实nodejs一样可以做服务端渲染,这时候会产生ajax跨域问题,...

    小尘哥
  • 让系统自动选择空闲的GPU设备!帮你一次解决抢卡争端

    项目地址:QuantumLiu / tf_gpu_manager 更新:支持pytorch 使用 git clone https://github.com/...

    AI研习社
  • 开发 | 如何为TensorFlow和PyTorch自动选择空闲GPU,解决抢卡争端

    AI科技评论按:本文作者天清,原文载于其知乎专栏 世界那么大我想写代码,AI科技评论获授权发布。 项目地址:https://github.com/Quantum...

    AI科技评论
  • 碎片化 | 第四阶段-39-Struts2中session对象梳理-视频

    如清晰度低,可转PC网页观看高清版本: http://v.qq.com/x/page/v05675uv6gg.html 登录使用session Struts...

    码神联盟
  • 碎片化 | 第四阶段-38-Struts2登录session对象封装-视频

    如清晰度低,可转PC网页观看高清版本: http://v.qq.com/x/page/t0567iayz50.html 登录使用session Strut...

    码神联盟
  • 微信支付,官方demo报错的两处解决办法

    一、报错信息:Fatal error: Call to undefined function libxml_disable_entity_loader() in...

    世纪访客

扫码关注云+社区

领取腾讯云代金券