`
zhaohaolin
  • 浏览: 1018008 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

由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)   
    System.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了。

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

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

具体来说cookie机制采用的是在客户端保持状态的方案。它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持。cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力。

正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的 cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由浏览器按照一定的原则 在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该 cookie附在请求资源的HTTP请求头上发送给服务器。

cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie 的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般 不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些 cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的 cookie,不同的浏览器有不同的处理方式

而session机制采用的是一种在服务器端保持状态的解决方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所 以session机制可能需要借助于cookie机制来达到保存标识的目的。而session提供了方便管理全局变量的方式 。

session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。

就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的session机制更安全些,因为它不会任意读取客户存储的信息。

session机制

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

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

保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于 SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。

经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:

<form name="testform" action="/xxx">   
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">   
<input type="text">   
</form> 

<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>

实际上这种技术可以简单的用对action应用URL重写来代替。

整理自网络

分享到:
评论

相关推荐

    tomcat修改jsessionid在cookie中的名称

    这表明默认情况下,如果没有显式设置系统属性 `org.apache.catalina.SESSION_COOKIE_NAME`,那么`SESSION_COOKIE_NAME` 的值将为 “JSESSIONID”。 ##### 2. Tomcat 6.x/7.x 源码解析 在Tomcat 6.x 和 7.x 中,...

    cookie_session知识点

    1. **依赖关系**:Session通常依赖于Cookie中的jsessionid来标识用户。当服务器找不到客户端的jsessionid或者对应的Session过期或已被销毁,服务器会创建新的Session对象。 2. **创建时机**: - 第一次请求时,...

    session与cookie.doc的区别

    Session和Cookie是两种常见的Web应用程序中用于管理用户会话的技术,它们主要的区别在于存储位置、生命周期和安全性。 **Session** 1. **存储位置**:Session是服务器端存储机制,它在服务器上为每个用户开辟一块...

    JavaWeb基础-Cookie和Session的简单使用案例

    在JavaWeb开发中,Cookie和Session是两种常见的用户会话管理技术,用于在客户端和服务器之间传递信息。本文将深入探讨这两个概念,并通过一个简单的登录案例来阐述它们的使用。 首先,Cookie是服务器发送到用户...

    session实质就是cookie

    ### Session与Cookie关系详解 #### 一、会话管理概览 在Web开发中,会话管理是一项重要的技术,它负责维护用户与服务器之间交互的数据。通常,这种交互包括用户的登录状态、购物车中的商品信息等。为了实现这些...

    cookie和session的运用

    #### 一、Cookie与Session的基本概念及区别 **Cookie** 和 **Session** 是两种用于跟踪用户会话的技术,在Web开发中非常常见。它们的主要功能是帮助服务器识别用户并维持用户的登录状态等信息。 ##### 1. Cookie -...

    基于Cookie的Session跨域.zip

    在Web开发中,Session和Cookie是两种常见的用户会话管理技术。它们被广泛应用于保持用户的登录状态,确保用户在访问不同页面时仍能保持个性化设置和数据连续性。本项目"基于Cookie的Session跨域"则关注如何在分布式...

    Session Cookie的HttpOnly和secure属性

    其次,GlassFish2.x支持的是servlet2.5,而servlet2.5不支持Session Cookie的"HttpOnly"属性。不过使用Filter做一定的处理可以简单的实现HttpOnly属性。GlashFish3.0(支持servlet3.0)默认开启Session Cookie的...

    session和cookie详解

    #### 二、Session与Cookie的区别 1. **存储位置**: - **Session**:数据存储在服务器端,客户端只知道Session ID,具体的数据由服务器管理。 - **Cookie**:数据存储在客户端,服务器可以通过HTTP头部获取这些...

    Java使用cookie和session共7页.pdf.z

    在Java Web开发中,Cookie和Session是两种非常重要的会话管理技术,它们用于跟踪和维护用户的状态信息。本文将深入探讨这两个概念,以及如何在实际应用中有效地利用它们。 首先,我们来理解Cookie。Cookie是一种在...

    cookie session 的概念和基本用法

    5. **Session与Cookie的关系**:Session依赖于Cookie来标识用户会话。服务器通过在Cookie中设置一个唯一标识符(如JSESSIONID)来关联特定的Session。当浏览器关闭,依赖Cookie的Session也会失效,因为失去了识别...

    java Session cookie

    **Session与Session Cookie** Session是服务器端保存用户状态的一种方法。当用户登录或进行其他需要记录状态的操作时,服务器会在内存中创建一个Session对象,这个对象用来存储用户的会话数据。为了将这个Session与...

    一个服务器搭多个tomcat导致session丢失,或者同一个IP不同端口,多个应用的session会冲突解决方法

    经过资料查找,发现问题是因为:IP相同认为是同一个域,接收了B的set-cookie指令,把对应的cookie内容覆盖了,其中包括jsessionid,造成A的session丢失。 如果IP不同,则不会发生这个问题。IP相同的两个session对应的...

    cookie设置httpOnly和secure属性实现及问题

    response.setHeader("Set-Cookie", "JSESSIONID=" + sessionID + "; Path=/yourPath; Secure; HttpOnly"); ``` - **问题2**: 修改程序中不兼容的代码 - **现象1**: 设置`HttpOnly`属性后,程序无法获取客户端...

    IFrame中Session丢失的解决办法

    在探讨“IFrame中Session丢失的解决办法”这一主题时,我们首先需要理解Session与IFrame的基本概念及其在Web开发中的交互方式。Session是Web应用中用于存储用户特定信息的一种机制,它允许开发者在用户的会话期间...

    android获取jsessionId和发送jsessionId

    在Android开发中,与服务器进行交互是常见的任务,而`jsessionId`是Web应用程序中用于跟踪用户会话的一种机制。本文将详细讲解如何在Android客户端获取`jsessionId`以及如何在后续请求中发送`jsessionId`,以保持...

    Session和Cookies的区别

    ### Session和Cookies的区别详解 #### 一、引言 在Web开发中,Session 和 Cookies 是两种常见的用于跟踪用户会话的技术。尽管它们都能实现会话跟踪的功能,但在具体的应用场景和实现机制上存在显著差异。本文将从...

    session的实现方式

    它与第一种情况没有什么区别,但在 Cookie 禁用时,它会将 SessionID 的信息作为请求地址的一部分传到了服务器端,这就是 URL 重写的意义所在。 URL 重写可以使 Session 生效,即使客户端禁用了 Cookie,这样可以...

    IE的cookie机制导致的session问题及解决办法.doc

    标题与描述概述的知识点主要集中在Internet Explorer(IE)的Cookie机制如何引发Session丢失的问题,并探讨了解决方案。本文将深入解析这一现象的原因、影响以及如何有效应对。 ### 一、IE Cookie机制与Session关联...

    CASClient集群环境的Session问题及解决方案.docx

    由于每个应用都有其自己的 JSESSIONIDCookie,因此无法在不同的应用之间共享 Session 信息。例如,用户首先访问 CAS Client 01,登录成功后,系统会将用户的 Session 信息存储在浏览器中的 Cookie 中。当用户访问 ...

Global site tag (gtag.js) - Google Analytics