会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

一.cookie和session机制之间的区别和联系

具体来说cookie机制采用的是在客户端保持状态的方案。它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持。cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力.而session机制采用的是一种在客户端与服务器之间保持状态的解决方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的。而session提供了方便管理全局变量的方式

session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。就安全性来说:当你访问一个使用session的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。

正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。从网络服务器观点看所有HTTP请求都独立于先前请求。就是说每一个HTTP响应完全依赖于相应请求中包含的信息。状态管理机制克服了HTTP的一些限制并允许网络客户端及服务器端维护请求间的关系。在这种关系维持的期间叫做会话(session)。

Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。IETFRFC2965HTTPStateManagementMechanism是通用cookie规范。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies

二.理解session机制session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识称为sessionid,如果已包含一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionid将被在本次响应中返回给客户端保存。

保存这个sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把sessionid传递回服务器。经常被使用的一种技术叫做URL重写,就是把sessionid直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把sessionid的信息和正常程序参数区分开来。为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个sessionid。

另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把sessionid传递回服务器。这种技术现在已较少应用,笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。实际上这种技术可以简单的用对action应用URL重写来代替。

在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做logoff的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存sessionid,而关闭浏览器后这个sessionid就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的sessionid发送给服务器,则再次打开浏览器仍然能够找到原来的session。

恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

由JSESSIONID谈cookie与SESSION的区别和联系

在一些投票之类的场合,我们往往因为公平的原则要求每人只能投一票,在一些WEB开发中也有类似的情况,这时候我们通常会使用COOKIE来实现,例如如下的代码:

Tag标签:

java程序员从菜鸟到笨鸟_Java程序员从笨鸟到菜鸟之论session和cookie机制相关推荐

  1. java程序员面试怎么难为面试官_Java程序员面试这些多线程问题你知道吗?

    在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.所以你应该准备很多关于多线程的问题.在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的.他们会问面试者很 ...

  2. java写一个外网访问的接口_Java程序员如何入门?教你写第一个程序

    大家都知道,Java是一门面向对象的编程语言,不仅吸收了C++的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大.简单易用. 另外,Java允许程序员以优雅的思维方 ...

  3. java程序员要去学c 吗_java程序员是否要学c++

    如题,我觉得其实有这个必要.可以从几个方面来看,首先我们不说java与c++语言本身的特性.从历史上来看,java和c++就有着比较密切的关系.很多人认为java就是简化版的带虚拟机的c++.这样我们 ...

  4. java的jvm和事务并发的关系_Java程序员岗面试总结

    1.分布式事务 事务就是一个会话过程中,对上下文的影响是一致的,要么所有的更改都做了,要么所有的更变都撤销掉.就要么生,要么死.没有半死不死的中间不可预期状态. 事务是为了保障业务数据的完整性和准确性 ...

  5. java程序猿面试问缺点怎么回答_JAVA程序员面试32问,你能回答多少题

    第一,谈谈final, finally, finalize的区别. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements ...

  6. java读取src路径下的txt文件_Java程序使用Maven后无法运行?

    问:老师,同样的代码,为何我将Java工程改造成Maven后,始终无法运行? 实现的功能:加载abc.txt文件,代码是写在了Demo类中. 开发工具是Idea. 1.以下是普通Java工程的目录结构 ...

  7. java hadoop2.6.0 读取文件报错_java 程序访问hdfs错误 hadoop2.2.0

    很奇怪的问题,程序在eclipse上跑没问题: 这就代码:FileSystem fs = FileSystem.get(URI.create(hdfs_file),  conf , "use ...

  8. java字符串统计英文字符用什么不同_JAVA程序。输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。...

    展开全部 一.问题分析: 输入32313133353236313431303231363533e58685e5aeb931333363373764一行字母,那么会以换行结束.所以可以存入数组,也可以逐 ...

  9. java程序员面试技术_java程序员面试应该具备的一些基本技能

    这里列举一些Java程序员面试应该要具备的一些基本技能,仅当参考. 1.基本语法 包括static.final.transient等关键字的作用,foreach循环的原理等等.越简单的问题越能看出一个 ...

  10. java程序员的日常_Java程序员的日常——经验贴(纯干货)

    工作当中遇到的事情比较杂,因此涉及的知识点也很多.这里暂且记录一下,今天遇到的知识点,纯干货~ 关于文件的解压和压缩 如果你的系统不支持tar -z命令 如果是古老的Unix系统,可能并不认识tar ...

最新文章

  1. 视频+课件| PointDSC:基于特征匹配的点云配准方法(CVPR2021)
  2. c语言fopen函数打不开,[讨论]用fopen函数无法打开文件有哪几种情况
  3. linux有没有递归函数,递归函数
  4. Eclipse中Copy Qualified Name复制类全名解决办法
  5. 绿联扩展坞拆解_拆解报告:UGREEN绿联3A1C四口多功能扩展坞(带SD卡槽版)
  6. catia 版本_KeyShot软件各版本对比详细信息!
  7. 常用PAM模块--完全笔记
  8. spring java 定时任务_spring定时任务的几种实现方式
  9. python django 商品进销存管理系统(毕设、课设、学习)
  10. 局域网络连接的计算机不全,大神教你win7局域网内可以看到对方计算机但无法连接的办法?...
  11. 【第一组】第二次例会会议记录
  12. python爬取下厨房网站首页图片request+bs4
  13. 利用js实现手机访问PC端直接跳转wap端
  14. 在物联网中应用机器学习
  15. UI设计从业者,怎样才能成为月薪过万的UI设计师?
  16. flutter app安卓应用开机自启动
  17. 2个月快速通过PMP证书的经验
  18. linux 命令 curl 详解
  19. mysql微擎用户名密码_微擎后台管理员密码忘记怎么办?教你一个简单的方法
  20. Ubuntu加装4T机械硬盘

热门文章

  1. (附源码)基于springboot校园医院预约挂号系统-计算机毕设 32236
  2. java初级工作总结_【初级java开发工作总结_初级java开发个人年终总结】-看准网...
  3. 继昆明、杭州、南昌地铁后,鸿雁照明再获郑州地铁千万大单!
  4. Flask+Vue+AntDesign通用后台权限管理系统
  5. 前后端分离_Vue_axios本地跨域(前端localhost:8080到后端localhost:8090)
  6. 抖音8090后怀旧视频玩法,小白新手可操作,迅速涨粉变现
  7. 北京理工大学计算机考研机试KY258 日期累加
  8. 【100%通过率】华为OD机试真题 JS 实现【单词倒序】【2022 Q4 | 100分】
  9. 浅谈深浅拷贝|手摸手带你入坑
  10. 机器人操作系统ROS(九):MoveIt!与机械臂控制