会话状态保持,JSESSIONID,COOKIE,URL重写

2023-10-31

居然有3W的访问量,好,我就把session和cookie的关系先来个总结,注意,是最最简单直白明了的总结了。

http协议,协议,协议,重要的说3遍,http协议主要有2大块,请求头和请求体,cookie在http请求头里,就是一个由多个KV组成的的字符串而已,其中有一个key=JSESSIONID。

client---the 1st time--->sever,header 的cookie中无JSSIONID

server--response--->client, server发现请求头中无JSSIONID,好,我来给你产生一个随机值,返回给你,在response的header中,多了一个东西, Set-Cookie:JSESSIONID=xxx

client--reveive response from server,发现response header中有Set-Cookie,好,以后我再请求server时,把这些Cookie都带上,其中就包含了JSESSIONID

client--the 2nd time--->server, 带上了所有的cookie内容

server---response--->client,带上了所有的cookie内容

所以,基于session的会话保持,是靠client和server共同协作才能完成的,server产生sessionId,然后大家一直传来传去,就这么一直玩下去,直到session timeout,或注销。


今天说说:会话状态保持,JSESSIONID,COOKIE之间的关系

在服务器端,我们用惯了session.setAttribute("",userInfo)这样的一行代码,估计你很少想到:服务器与浏览器之间是如何保持会话状态的。好了,先引用一些文章的精彩片段:

 

http://www.xxx.com/xxx_app;jsessionid=xxxxxxxxxx?a=x&b=x。

这跟一般的url基本一样,只有一个地方有区别,那就是“;jessionid=xxxxxxxx”。这个参数有时候有,有时候又没有,说它是参数可又跟一般传递的参数不同,它是紧跟在url后面用分号来分隔的,用一般的request.getParameter()方法还取不到jsessionid

 

启动你的tomcat,打开FireFox(爱得不得了,一定要安装FireBug),输入localhost就行,打开firebug,点网络,你会看到,浏览器与服务器会话的信息,给出浏览器

(1)第一次请求服务器:

浏览器的请求头信息

Host localhost
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language zh-cn,zh;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive 115
Connection

keep-alive

 


在下图



在下图



服务器响应头信息

Server Apache-Coyote/1.1
Set-Cookie JSESSIONID=64D21B4D69DFB3041B6375C1932BD6CB; Path=/
Content-Type text/html;charset=UTF-8
Content-Language zh-CN
Content-Length 242
Date Mon, 28 Jun 2010 02:35:29 GMT

(2)第二次请求服务器:

浏览器的请求头信息

Host localhost
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language zh-cn,zh;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive 115
Connection keep-alive
Cookie JSESSIONID=64D21B4D69DFB3041B6375C1932BD6CB

服务器响应头信息

Server Apache-Coyote/1.1
Content-Type text/html;charset=UTF-8
Content-Language zh-CN
Content-Length 242
Date Mon, 28 Jun 2010 02:37:51 GMT

重复第三次,每四次...第N次请求服务器,浏览器和服务器的请求头信息都是与第二次请求服务器是一样的。


(3)但是,如果你在服务器端加入如下一行代码:

Log.info("SessionId:" + request.getSession().getId());

你会看到,当你第一次请求服务器时,就会默认有一个新的session被创建,而且在session的有效时间范围内,这个输出值是不会变的,否则,服务器会重新创建一个session,自然,sessionId也就不同了,这段代码的输出自然也会不同了。

 

(4)你必须注意这一点:你用的是浏览器与服务器通信:

有一些事情是浏览器帮助我们去做了,那就是:当你第一次与服务器通信时,浏览器会保存服务器返回的Set-Cookie这个健的值(JSESSIONID=64D21B4D69DFB3041B6375C1932BD6CB),只要你不关闭浏览器(彻底关闭,关闭选项卡不算),浏览器会从第二次向服务器发出请求开始,一直带上这个键值对,发给服务器。服务器就会知道,这是同一个人(同一个会话)发起的请求。

 

(5)我们再注意一下:request.setAttribute("sysuser",userInfo)这句话:

当你第一次请求服务器时,这句代码会根据服务器默认产生的session得到ID,并与sysuser=userInfo这个键值对挂上钩(当然,userInfo可以是任何对象),保证唯一关联,检测用户是否登录就是这样实现的。

我一定要声明一点:保持一个会话与用户是否登录是没有任何关系的。

 

(6)再次引深一下,如果你用的不是浏览器,比如说做J2ME开发,怎样保持会话呢?

(1)在你写完这行代码后:HttpConnection hc = (HttpConnection)Connector.open(httpURL),加入以下代码:(Constant.sessionID只是一个静态变量)

 

(2)A:只向服务器读数据,不向服务写数据,B:先向服务器写数据,再从服务器读数据

对于这两种情况,只要你第一次打开openDataInputStream(),这可以加入以下代码(Constant.isLogin只是一个静态变量boolean):

 

这样就可以保持一个会话了。


(7)最后,关于URL重定向

引用一段话:sun帮我们想到了,所以提供了2个方法来使事情变得简单:response.encodeURL()和response.encodeRedirectURL()。这2个方法会判断cookie是否可用,如果禁用了会解析出url中的jsessionid,并连接到指定的url后面,如果没有找到jessionid会自动帮我们生成一个。至于为什么要有2个方法?这2个方法有什么不同?google了一下,说是这2个方法在判断是否要包含jsessionid的逻辑上会稍有不同。在调用 HttpServletResponse.sendRedirect前,应该先调用encodeRedirectURL()方法,否则可能会丢失 Sesssion信息。这2个方法的使用方法如:response.sendRedirect(response.encodeURL("/myapp /input.jsp"));。如果cookie没有禁用,我们在浏览器地址栏中看到的地址是这样的:/myapp/input.jsp,如果禁用了 cookie,我们会看到:/myapp /input.jsp;jsessionid=73E6B2470C91A433A6698C7681FD44F4。所以,我们在写web应用的时候,为了保险起见,应该在程序里的每一个跳转url上都使用这2个方法,来保证session的可用性。

原文引自

 

(8)Fighting And Keep Moving!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

会话状态保持,JSESSIONID,COOKIE,URL重写 的相关文章

  • 是否允许在 URL 中使用非英语 (ASCII) 字符以进行 SEO?

    我有很多 UTF 8 内容 我想将它们插入到 URL 中以用于 SEO 目的 例如 我想要包含在 URI 中的帖子标签 site com tags id TAG NAME 但是 标准仅允许 ASCII 字符 URI 中允许的字符 但没有保留
  • Facebook 分享链接 - 可以自定义消息正文吗?

    我正在尝试创建一个在 Facebook 上共享页面的链接 到目前为止我已经得到 href http www facebook com sharer php u http 3A 2F 2Fwww cnn com 2F t CNN 26s we
  • Magento 外部登录不会创建会话 cookie

    我正在尝试从外部站点替换 Magento 的相当笨拙的 ajax 登录 该网站使用 Magento 作为商店 站点和 magento 商店都有自己的登录信息 因此当用户登录时 两者同步非常重要 这是通过每次页面重新加载时进行 ajax 调用
  • NHibernate Session.Flush & Evict 与 Clear

    在一个测试中 我想要持久化一个对象 然后通过从数据库 而不是会话 获取它来证明它是持久化的 我注意到以下内容没有区别 save it session Clear fetch it or save it session Flush sessi
  • 有没有办法清除所有会话中的一些会话数据?

    一般来说 我有以下场景 从数据库中获取产品及其相关数据 将获取的数据转换为 php product 对象 在会话中缓存产品对象 缓存是只读的 即客户在网站上查看产品 但也有类似的电话getProductIdsByCategory categ
  • Codeigniter:用户会话不断过期

    我正在使用 CodeIgniter 但在会话方面遇到了一个小问题 我已将 config php 中的 sess expiration 设置为 0 以便用户会话永远不会过期 但用户 甚至我自己 仍然偶尔会被踢出并要求再次登录 顺便说一句 我将
  • PDO 静默准备失败[重复]

    这个问题在这里已经有答案了 我正在尝试 PHPsession set save handler我想使用 PDO 连接来存储会话数据 我有这个函数作为写入操作的回调 function write id data logger WRITE id
  • 随机 IIS 会话超时

    我有一个非常奇怪的问题 我正在寻求任何建议 我有一个运行在 IIS 6 上的 ASP NET 网站 它在大多数情况下运行良好 但是 会话似乎是随机清除的 因此 如果我登录 单击周围 我就会被随机启动 有时是在 30 秒 4 次点击之后 有时
  • REST URL 结构建议

    我正在尝试为我正在开发的网站的愿望清单部分敲定一个宁静的网址结构 这是一个非常简单的模型 用户可以有许多愿望清单 每个愿望清单可以包含许多产品 目前我有明显的 CRUD URL 来操作愿望清单本身 GET account wishlists
  • 如何使用 C# 上传文件并将其保存到 Stream 以便进一步预览?

    有没有办法上传文件 将其保存到流中 该流我会将其临时保存在会话中 最后 我将尝试预览此会话中的此上传文件 例如 pdf 文件 Thanks EDITED 这就是我想做的 HttpPostedFileBase hpf Request File
  • 如何从网址中删除查询?

    我正在使用 scrapy 抓取一个网站 该网站似乎将随机值附加到每个 URL 末尾的查询字符串 这将爬行变成了一种无限循环 我如何让 scrapy 忽略 URL 的查询字符串部分 See urllib urlparse http docs
  • session_regenerate_id(true) ajax 请求或快速刷新时的无效会话

    为了避免会话固定 我在每个 PHP 页面的开头使用以下代码 session set cookie params 900 domain 1 1 session start session regenerate id true 但如果页面刷新太
  • 一键提交多个表单

    我在用 SESSION为我的网上商店动态创建表单 这些表单包含客户想要的产品的自定义信息 这是布局 Page1 客户填写的表格如下所示
  • 在android中的webview中运行时更改URL

    我创建了一个小程序 可以在 webview 中加载特定网站 我想密切关注 URL 如果 URL 包含 xxx 单词 那么它应该导航到另一个页面 例如 如果我设置 www example com 我现在可以导航到 www example co
  • Rails 渲染 JSON - 会话丢失?

    我正在尝试对控制器进行一些 Ajax 调用 该控制器以 JSON 进行响应 if session user render json gt Some Data else render json gt You are not logged in
  • Symfony2 功能测试会话持久性

    我正在尝试在 Symfony 中进行一些功能测试 但目前我的会话遇到了问题 我执行了一段代码 它似乎有效 但容器的会话中没有存储任何内容 我有一个表格 您可以在其中设置数据 当您提交它时 它会检查值并将其存储在会话中 然后它重定向到另一个页
  • NHibernate、数据绑定到 DataGridView、延迟加载和会话管理 - 需要建议

    我的主应用程序窗体 WinForms 有一个 DataGridView 它使用 DataBinding 和 Fluent NHibernate 显示 SQLite 数据库中的数据 该表单在应用程序运行的整个过程中都是打开的 出于性能原因 我
  • session_start():无法解码会话对象

    我有时在使用 CodeIgniter 时遇到以下问题 错误 2019 03 05 19 57 26 gt 严重性 警告 gt session start 无法解码会话对象 会话已被销毁 system libraries Session Se
  • 为什么LocalSessionFactoryBean不实现getCurrentSession,而SessionFactory的实例却可以调用该方法?

    这是我的 Spring Bean 配置
  • Django 检索 GET 列表

    我是 Django 新手 我有一个 URL 列表 例如 example com item test item for test url 我知道如何在视图中检索该值 a request GET getlist item 我的问题是 如何在模板

随机推荐

  • 确定你的public继承塑模出is-a关系——条款32

    如果你令class D Derived 以public形式继承class B Base 你便是告诉C 编译器 以及你的代码读者 说 每一个类型为D的对象同时也是一个类型为B的对象 反之不成立 你的意识是B比D表现出更一般化的概念 而D比B表
  • 开关电源-电容

    电子元器件 电容 1 电容是电路中重要的元件 种类多 用途广 主要有插件类和贴片类两种 2 电容主要特性参数 标称容量 耐压 误差 温度 2 1电容容量常用单位有微法 uF 纳法 nF 皮法 pF 单位换算 luF 103nF 106pF
  • 【数模】编码的传输问题 Huffman算法编程实现(matlab)

    编码的传输问题 利用Huffman算法编程实现以下问题 已知字母A B C D E F出现的概率 字母 概率 A 35 B 10 C 20 D 10 E 20 F 5 哈夫曼编码基础知识复习 哈夫曼编码 Huffman Coding 又称霍
  • Tensorflow框架(张量、计算图、会话)

    张量 计算图 会话 人工智能实践 Tensorflow笔记 Tensorflow框架 张量 计算图 会话 基于Tensorflow的NN 神经网络 用张量表示数据 用计算图搭建神经网络 用会话执行计算图 优化线上的权重 参数 得到模型 张量
  • 抓包工具fiddler不抓取火狐浏览器的数据

    fiddler可以抓到google浏览器的包 但是抓不到Firefox浏览器的包 火狐浏览器版本79 0 64 位 fiddler 4 亲测好使 操作步骤 打开Fiddler gt 菜单栏 Tools gt Options gt Conne
  • sdf转smi

    from rdkit import Chem smi Chem MolToSmiles Chem SDMolSupplier sdf path 0
  • 全局组件和局部组件

    1 全局组件和局部组件的区别 全局组件 只需要在main js中导入一次 整个项目都可以直接使用 在main js中导入 局部组件 用一次 导一次 在用到的地方导入 2 局部组件导入步骤 3部曲 1 导入子组件 import Registe
  • 基于Flask框架的python微博数据分析

    Python 微博数据 博文 分析 项目简介 后端采用Flask框架搭建 通过移动端接口获取数据 数据清洗后采用jieba进行词法分析 通过WordCloud制作词云展示 数据的可视化在以后的版本中会细化 版本V0 0 1功能 能够获取用户
  • 1. redis核心数据结构实战与高性能原理剖析

    分布式缓存技术Redis 1 Redis的五种数据结构 1 1 String 1 2 hash 1 3 列表list 1 4 set 1 5 ZSet 2 Redis的单线程和高性能 3 其他高级命令 3 1 scan 渐进式遍历键 本文是
  • 从零开始学习微服务 -微服务基本概述、微服务案例

    1 SpringCloud概述 1 1 互联网应用架构 1 1 1 单体应用架构 在诞 之初 项目的 户量 数据量规模都 较 项目所有的功能模块都放在一个工程中编码 编译 打包并且部署在一个Tomcat容器中的架构模式就是单体应用架构 这样
  • SQL注入基础原理与案例(详细总结)

    SQL注入基础原理与案例 一 前言 二 漏洞概述及危害 1 漏洞概述 2 漏洞危害 3 漏洞防范 三 SQL注入 1 SQL注入方式 1 信息收集 2 数据注入 3 高权限注入 2 判断是否存在注入点 1 新办法 2 老办法 3 字段判断
  • vue使用高德地图--附带移动获取当前城市信息

    高德地图 1 使用准备 申请密钥 vue使用 2 移动地图获取城市案例 注意事项 3 总结 1 使用准备 申请密钥 登录注册高德开放平台进入控制台 创建应用 申请key 生成key和安全密钥 2021之后key需要配合安全密钥使用 注意 安
  • 流媒体直播播放协议:HLS、RTMP、HTTP-FLV

    流媒体直播播放协议 HLS RTMP HTTP FLV 一 推拉流 二 协议介绍 1 HLS 2 RTMP 3 HDL HTTP FLV 一 推拉流 在开始之前 先把流媒体服务中的双端关系说一下 在一个完整的流媒体服务框架中 角色就是 两端
  • 【直接收藏】前端JavaScript面试100问 (上篇)

    1 解释一下什么是闭包 闭包 就是能够读取外层函数内部变量的函数 闭包需要满足三个条件 访问所在作用域 函数嵌套 在所在作用域外被调用 优点 可以重复使用变量 并且不会造成变量污染 缺点 会引起内存泄漏 使用闭包的注意点 由于闭包会使得函数
  • 【代码规范】常见注释规范

    1 在有处理逻辑的代码中 源程序有效注释量必须在20 以上 说明 注释的原则是有助于对程序的阅读理解 在该加的地方都加了 注释不宜太多也不能太少 注释语言必须准确 易懂 简洁 2 文件注释 文件注释写入文件头部 说明 以 开始 示例 文件名
  • Linux踩坑(一)—— 切换到命令行登入不进去

    在最近使用Linux时 切换到使用快捷键 Ctrl Alt F3 切换到命令行时 却登入不进去 1 出现背景 当我使用root登入时登入不进去 而且我自己的用户名是中间有空格的 David Wolfowitz 我在命令行中这样输入一直无法登
  • 期权是什么?期权的优缺点是什么?

    期权是一种合约 有看涨期权和看跌期权两种类型 也就是做多和做空两个方向 走势标的物对应大盘指数 这也是期权与其他金融工具的主要区别之一 可以用于套利 对冲股票和激进下跌的风险 下文介绍期权是什么 期权的优缺点是什么 一 什么是期权 期权的标
  • Vue:子组件使用的细节,子组件中的data,ref的使用,

    我们创建一个table div table tbody tbody table div
  • 【工号不够用了怎么办?】

    题目描述 工号不够用了怎么办 3020年 空间通信集团的员工人数突破20亿人 即将遇到现有工号不够用的窘境 现在 请你负责调研新工号系统 继承历史传统 新的工号系统由小写英文字母 a z 和数字 0 9 两部分构成 新工号由一段英文字母开头
  • 会话状态保持,JSESSIONID,COOKIE,URL重写

    居然有3W的访问量 好 我就把session和cookie的关系先来个总结 注意 是最最简单直白明了的总结了 http协议 协议 协议 重要的说3遍 http协议主要有2大块 请求头和请求体 cookie在http请求头里 就是一个由多个K