`

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

    博客分类:
  • web
阅读更多

具体来说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是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。IETF RFC 2965 HTTP State Management Mechanism 是通用cookie规范。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
理解session机制
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

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

保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。

由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。
为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如下面的表单
<form name="testform" action="/xxx">
<input type="text">
</form>
在被传递给客户端之前将被改写成
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
这种技术现在已较少应用,笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。
实际上这种技术可以简单的用对action应用URL重写来代替。

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

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

在一些投票之类的场合,我们往往因为公平的原则要求每人只能投一票,在一些WEB开发中也有类似的情况,这时候我们通常会使用COOKIE来实现,例如如下的代码:
< % cookie[]cookies = request.getCookies();
if (cookies.lenght == 0 || cookies == null)
doStuffForNewbie();
//没有访问过 
}

else
{
doStuffForReturnVisitor(); //已经访问过了
}

% >

这是很浅显易懂的道理,检测COOKIE的存在,如果存在说明已经运行过写入COOKIE的代码了,然而运行以上的代码后,无论何时结果都是执行doStuffForReturnVisitor(),通过控制面板-Internet选项-设置-察看文件却始终看不到生成的cookie文件,奇怪,代码明明没有问题,不过既然有cookie,那就显示出来看看。
cookie[]cookies = request.getCookies();
if (cookies.lenght == 0 || cookies == null)
out.println("Has not visited this website");
}

else
{
for (int i = 0; i < cookie.length; i++)
{
out.println("cookie name:" + cookies[i].getName() + "cookie value:" +
cookie[i].getValue());
}
}

运行结果:
cookie name:JSESSIONID cookie value:KWJHUG6JJM65HS2K6 为什么会有cookie呢,大家都知道,http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,那么要怎么才能实现网上商店中的购物车呢,session就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,我们叫做session cookie,以区别persistent cookies,也就是我们通常所说的cookie,注意session cookie是存储于浏览器内存中的,并不是写到硬盘上的,这也就是我们刚才看到的JSESSIONID,我们通常情是看不到JSESSIONID的,但是当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,我们就可以在地址栏看到sessionid=KWJHUG6JJM65HS2K6之类的字符串。
明白了原理,我们就可以很容易的分辨出persistent cookies和session cookie的区别了,网上那些关于两者安全性的讨论也就一目了然了,session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本(通常是加密的),而且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击,自然不如session cookie安全了。
通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的sessionid,这样我们信息共享的目的就达不到了,此时我们可以先把sessionid保存在persistent cookie中,然后在新窗口中读出来,就可以得到上一个窗口SessionID了,这样通过session cookie和persistent cookie的结合我们就实现了跨窗口的session tracking(会话跟踪)。
在一些web开发的书中,往往只是简单的把Session和cookie作为两种并列的http传送信息的方式,session cookies位于服务器端,persistent cookie位于客户端,可是session又是以cookie为基础的,明白的两者之间的联系和区别,我们就不难选择合适的技术来开发web service了。

分享到:
评论

相关推荐

    雅马哈机械手视觉补偿系统的Socket通信与坐标转换实现详解

    内容概要:本文详细介绍了雅马哈机械手在锁螺丝过程中与视觉系统的协同工作流程,重点讲解了Socket通信的实现方法、坐标转换的具体步骤以及动态路径规划的技术细节。首先,文章展示了如何通过TCP/IP协议建立机械手与相机之间的稳定通信,确保数据传输的可靠性和实时性。接着,深入探讨了从像素坐标到机械臂笛卡尔坐标的转换过程,强调了标定矩阵的重要性和正确处理字节序的问题。此外,还讨论了托盘动态路径规划的实现,如螺旋式搜索算法的应用及其带来的效率提升。最后,文章分享了一些实际应用中的经验和教训,如处理粘包问题、网络延迟、异常处理机制等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对机械手与视觉系统集成感兴趣的读者。 使用场景及目标:适用于需要深入了解机械手与视觉系统协作机制的场合,帮助工程师更好地理解和优化工业生产线上的自动化设备。目标是提高生产效率和产品质量,减少因技术问题导致的生产停滞。 其他说明:文中提供了多个代码示例,涵盖Python、C++和C#等多种编程语言,便于不同背景的读者参考和实践。同时,作者结合自身经验,给出了许多实用的调试技巧和注意事项,有助于读者规避常见错误并快速解决问题。

    LabVIEW与西门子S7-200 PLC基于PPI协议的通讯实现及调试技巧

    内容概要:本文详细介绍了如何利用LabVIEW与西门子S7-200 PLC通过PPI协议进行通讯的方法和技术要点。主要内容涵盖硬件准备、通讯参数配置、PPI协议命令格式、命令发送与接收、数据解析以及常见问题的调试方法。文中强调了硬件选择、波特率设置、命令帧结构、CRC校验、超时处理等方面的具体操作步骤,并提供了多个实用技巧,如地址扫描、批量读取优化、字节序处理等。 适合人群:从事工业自动化系统集成、LabVIEW编程、PLC通讯开发的技术人员。 使用场景及目标:适用于需要将LabVIEW与西门子S7-200 PLC进行通讯的工程项目,帮助技术人员快速掌握PPI协议的应用,提高通讯稳定性和效率。 其他说明:文章不仅提供了详细的理论指导,还分享了许多实践经验,有助于解决实际应用中的各类问题。

    计算机二级考试资源合集

    计算机二级考试资源合集:高效备考,轻松通关! 本合集涵盖计算机二级考试核心内容,包括软件/硬件知识、编程、数据库、网络技术等,提供理论资料与实战资源(如PHP示例、网页文件、配置数据等),助你系统复习、强化实操。适合考生快速提升技能,顺利通过考试!

    【嵌入式系统】基于STM32的宠物饮水机C++源代码:实现循环过滤与水质清洁功能

    内容概要:本文档提供了基于STM32的宠物饮水机的C++源代码,实现了循环过滤和保持水质清洁的功能。代码包括硬件初始化、水位检测、温度监测、紫外线杀菌以及OLED显示等功能模块。通过水位传感器检测水位并控制水泵启停,使用DS18B20温度传感器监测水温并在OLED屏幕上显示,每小时自动启动紫外线灯进行杀菌5分钟。此外,详细解释了水位传感器的工作原理及其在代码中的实现,重点介绍了浮球式传感器的结构和工作过程。 适合人群:对嵌入式系统开发有一定了解,特别是熟悉STM32平台和C++编程的工程师或爱好者。 使用场景及目标:①学习STM32平台下的硬件初始化和外设驱动编程;②掌握水位传感器、温度传感器及紫外线杀菌功能的设计与实现;③理解浮球式水位传感器的工作原理及其在实际项目中的应用。 阅读建议:此资源不仅提供了完整的源代码,还详细解释了每个功能模块的实现细节,适合在实际项目中参考和学习。建议读者结合STM32开发板进行实践操作,深入理解各个功能模块的工作机制,并根据具体需求进行功能扩展和优化。

    Gerber-语音模块

    语音模块的打印文件,直接使用。

    ### NA200H 可编程控制器硬件手册概述

    内容概要:本文档是傲拓科技股份有限公司发布的NA200H可编程控制器(PLC)硬件手册,旨在详细介绍NA200H系列PLC的硬件特性、安装、拆卸与接线原则。NA200H系列PLC是一款小型一体化PLC,具有集成以太网接口,适用于恶劣运行环境,具备良好的扩展性能和低廉的价格。手册涵盖了NA200H PLC的硬件组成(包括CPU模块和各种扩展模块)、工作方式、编程软件介绍、快速应用指南以及详细的安装、拆卸与接线原则。此外,手册还提供了CPU模块和各类I/O扩展模块的技术参数、端子定义与接线说明,并介绍了多种通讯模块的功能和特性。最后,附录部分列出了订货参数和扩展模块的功率消耗清单。 适合人群:具备一定电气知识的操作人员和技术人员,特别是从事自动化控制系统设计、安装和维护的工程师。 使用场景及目标:①帮助用户了解NA200H PLC的硬件结构和工作原理;②指导用户正确安装、配置和维护NA200H PLC;③协助用户选择合适的扩展模块以满足特定的应用需求;④提供详细的接线和通讯配置指导,确保系统稳定运行。 阅读建议:本手册内容详尽,建议读者在使用产品前仔细阅读并理解相关内容,尤其是安装、拆卸和接线部分,以确保系统的安全和稳定运行。同时,建议结合实际应用场景,灵活运用手册中的信息,进行合理的系统设计和配置。

    社交电商卡盟租号商城陪玩建站代刷电脑手机端官网源码

    电脑手机端全新UI界面优化更新 支持PC+wap端自动识别跳转 代码工整易于阅读,方便二次修改 全站幻灯片后台自定义更换 大部分可见数据后台可自行修改配置 栏目结构层次清晰,非常利于搜索引擎优化 服务器环境:PHP>=5.3,支持最新的PHP7 系统默认采用Sqlite数据库,放入PHP(5.3+)环境即可直接使用, 系统独家支持七牛云对接,无论你是否启用七牛云,请把轮播图,栏目大图,定制标签内的部分图片重新上传可直接保存图 片,重新上传一下,否则不会图片可能会不显示(因为那些图片在我们的七牛云内) 授权码生成:https://www.pbootcms.com/freesn/ 默认采用sqlite数据库,不需要做导入和配置操作 为了网站各个页面正常运行,请不要修改URL规则 统计代码、商桥代码、各种客服代码,均可放置在后台统计位置,全站生效。 浏览器标签logo在根目录favicon.ico,ico格式百度一下,可以生成 后台地址:您的域名/admin.php 账号:admin密码:123456789

    甲壳虫adb助手安全下载.apk

    甲壳虫adb助手安全下载.apk

    蓝桥杯省赛考点整合,模块总结

    内容概要:本文档《1_蓝桥杯省赛考点整合.pdf》详细介绍了蓝桥杯省赛中常见的硬件模块及其编程实现方法。主要包括Led模块、Key模块、Seg模块、ds1302、ds18b20、PCF8591、EEPROM、超声波模块、串口通信、NE555定时器以及蜂鸣器继电器的底层代码和具体应用实例。每个模块都涵盖了代码示例、功能解释及具体的省赛题目应用场景。例如Led模块展示了如何根据模式显示Led、Led闪烁和PWM亮度调整;Key模块讲解了模式切换、参数设置和按键长按短按等功能;Seg模块则侧重于正常数据显示和闪烁效果。

    Matlab图像拼接GUI:基于Harris角点、SIFT匹配、RANSAC优化的五模块实现

    内容概要:本文详细介绍了基于Matlab的图像拼接GUI系统的实现过程,涵盖了五个主要模块:系统管理、角点提取(Harris角点)、特征匹配(SIFT匹配)、匹配优化(RANSAC)和图像拼接(单映变换)。系统管理模块负责初始化环境和参数设置;角点提取模块使用Harris角点算法识别图像的关键点;特征匹配模块通过SIFT算法寻找匹配点对;匹配优化模块采用RANSAC算法去除误匹配点;最终图像拼接模块利用单映变换完成图像融合。文中还提供了大量代码示例和参数调优技巧,如高斯滤波的sigma值选择、SIFT匹配阈值设定、RANSAC迭代次数和像素容差调整等。 适合人群:对图像处理感兴趣的初学者和有一定编程基础的研究人员。 使用场景及目标:适用于学习和研究图像拼接技术,尤其是希望通过Matlab实现图像处理算法的人群。目标是掌握图像拼接的基本原理和技术实现,能够独立构建类似的图像处理系统。 其他说明:文中提供的代码仅供学习参考,实际应用中建议进一步优化和改进。同时,文中提及了一些实用技巧,如内存管理和性能优化,有助于提高系统的稳定性和效率。

    西门子S7-200 Smart PLC在30吨双级反渗透水处理系统的应用与优化

    内容概要:本文详细介绍了基于西门子S7-200 Smart PLC的30吨双级反渗透水处理系统的设计与实现。主要内容涵盖了一键制水、加药控制、触摸屏组态、程序结构优化等方面的技术细节。文中不仅展示了具体的PLC梯形图代码片段,还分享了许多现场调试的经验和技巧,如定时器防抖、中断优先处理、PID闭环控制的应用等。此外,文章还提到了一些实用的功能设计,如无人值守模式的安全机制、长按按钮触发高级设置等。 适合人群:从事水处理自动化系统设计、维护的工程师和技术人员,尤其是熟悉西门子PLC编程的从业者。 使用场景及目标:适用于需要稳定产水的工业应用场景,帮助工程师理解和掌握双级反渗透系统的控制逻辑,提高系统的可靠性和效率。同时,也为新手提供了宝贵的调试经验和注意事项。 其他说明:文章强调了程序结构的模块化设计,便于后期维护和参数调整。建议读者结合提供的工程文件进行仿真练习,以便更好地理解系统的工作原理。

    LabVIEW多路温度采集系统的Modbus通讯与高级特性应用

    内容概要:本文详细介绍了基于LabVIEW 2018版开发的多路温度采集系统,涵盖了系统架构设计、Modbus通讯实现、FGV(功能性全局变量)应用、队列管理和引用控制等多个高级知识点。系统采用了一主两从的串口连接方式,其中一个从机负责温度采集,另一个从机负责开关控制。文中提供了具体的代码示例,如串口配置、Modbus主站配置、数据读取、FGV创建与使用、队列操作等,展示了如何通过这些技术实现高效的数据传输和处理。 适用人群:适用于有一定LabVIEW基础的研发人员和技术爱好者,尤其是希望深入理解LabVIEW高级特性和Modbus通讯机制的人群。 使用场景及目标:①掌握LabVIEW中Modbus通讯的具体实现方法;②学会使用FGV实现跨VI的数据共享;③理解队列在多线程数据处理中的应用;④熟悉引用控制在动态界面更新中的作用。通过这些技术的应用,可以提高项目的开发效率和系统的稳定性。 其他说明:本文不仅提供了详细的代码示例,还分享了许多实践经验,如如何避免内存泄漏、如何处理异常情况等。此外,作者还强调了系统架构的设计思路,如分层设计、生产者-消费者模式等,这些都是实际项目开发中非常重要的考虑因素。

    RAG-N算法,滤波器加法器优化代码

    RAG-N算法,滤波器加法器优化代码

    软考软件设计师高频考点精析

    《软考软件设计师高频考点精析》精准提炼考试核心内容,涵盖编程语言、数据结构、操作系统、数据库、软件工程等必考领域。结合历年真题与实战技巧,助你快速掌握重点,高效备考。一册在手,轻松攻克软考难关!

    LabVIEW与CAN通讯上位机集成:基于周立功库文件的实现方法及应用

    内容概要:本文详细介绍了如何利用LabVIEW和周立功库文件构建一个能够进行基本CAN通讯的上位机系统。主要内容涵盖前期准备工作,包括安装LabVIEW软件和下载相关库文件;创建LabVIEW项目,调用库文件实现CAN设备初始化、数据发送与接收等功能的具体步骤;以及一些常见的注意事项和避坑指南。此外,还提供了进阶玩法,如封装成子VI、优化接收处理逻辑等。 适合人群:适用于初次接触LabVIEW和CAN通讯的技术爱好者,尤其是希望快速掌握CAN通讯上位机开发的初学者。 使用场景及目标:本教程旨在帮助用户建立一个简易的CAN通讯平台,以便于后续深入研究或实际项目开发。通过动手实践,读者将学会如何配置CAN设备、编写数据传输代码,并理解CAN通讯的基本原理。 其他说明:文中附带了详细的代码示例和实用技巧,有助于提高学习效率。同时强调了正确配置结构体成员顺序、管理设备句柄、匹配波特率等关键点,以确保系统的稳定性。

    永磁同步电机矢量控制C代码实现及其S-function仿真与实际应用

    内容概要:本文详细介绍了永磁同步电机(PMSM)矢量控制的C代码实现,涵盖从理论到实践的全过程。首先解释了矢量控制的基本原理,即通过坐标变换将三相电流解耦为励磁电流和转矩电流,以便独立控制电机的转矩和磁通。接着介绍了S-function模式仿真的优势,强调它可以灵活嵌入自定义代码并与其他Simulink模块协同工作。文中提供了关键的C代码示例,包括电机参数和状态变量的初始化、Clark变换和Park变换的具体实现、PI控制器的设计以及SVPWM生成算法。此外,还讨论了代码移植到实际工程项目中的注意事项,如硬件资源对接、参数调整和优化技巧。 适合人群:从事电机控制系统开发的技术人员,尤其是有一定C语言编程基础并对永磁同步电机矢量控制感兴趣的工程师。 使用场景及目标:适用于希望深入了解永磁同步电机矢量控制原理并在实际项目中应用相关技术的研发人员。主要目标是帮助读者掌握从仿真到实际应用的完整流程,提高电机控制系统的开发效率和稳定性。 其他说明:文中不仅提供了详细的代码示例,还分享了许多来自实际项目的宝贵经验和技术细节,如定点运算优化、锁相环(PLL)实现中的常见问题及解决方案、PI控制器的抗积分饱和处理等。这些内容对于理解和解决实际开发中的难题非常有帮助。

    流变学在材料科学中的应用:聚合物流变学仿真.zip

    流变学在材料科学中的应用:聚合物流变学仿真.zip

    LabVIEW与三菱FX PLC编程口协议通讯详解及应用

    内容概要:本文详细介绍了如何使用LabVIEW与三菱FX系列PLC进行编程口协议通讯。首先解释了协议的基本结构,包括起始符、结束符、ASCII字符指令以及校验码的计算方式。接着展示了具体的LabVIEW代码实现,涵盖了串口配置、命令帧构造、数据解析等关键步骤。文中还分享了许多实用技巧和常见错误的解决方案,如正确设置串口参数、处理特殊字符、优化读取速度等。此外,作者提供了完整的工程源码,并强调了在实际应用中需要注意的问题,如通信间隔控制和浮点数处理。 适合人群:从事工业自动化领域的工程师和技术人员,特别是熟悉LabVIEW和三菱PLC的用户。 使用场景及目标:适用于需要通过编程口与三菱FX系列PLC进行通讯的应用场景,如读取寄存器数据、监控设备状态等。目标是帮助读者掌握LabVIEW与三菱PLC通讯的具体实现方法,提高工作效率。 其他说明:文中提到的所有代码和技巧均经过实际验证,确保可行性和可靠性。建议读者在实践中结合自己的具体需求进行调整和优化。

    蓝桥杯Python之自动生成数据库表字典的markdown文本3.zip

    蓝桥杯python 蓝桥杯Python之自动生成数据库表字典的markdown文本3.zip

Global site tag (gtag.js) - Google Analytics