`

【整理】Session和Cookie的区别,关系和应用

阅读更多
引用
申明:本文结合网络,书本和自己的理解而成,在此申明文章引用来源。
来源:http://www.blogjava.net/freeman1984/archive/2010/09/09/331501.html

1.Session和Cookie的区别
对象信息量大小保存时间应用范围保存位置
Session小量,简单的数据用户活动时间+一段延迟时间(一般为20分钟)单个用户服务器端
Cookie小量,简单的数据可以根据需要设定单个用户客户端

1.1 Session对象
浏览器访问服务器时,服务器会创建一个对象(该对象也称为session对象,该对象有一个唯一的id号与其对应)。然后,服务器会将id号发送给浏览器(默认情况下,使用cookie机制发送)。当浏览器再次访问服务器时,会将id号发送过来。服务器可以依据id号找到对应的session对象。通过这个session对象,来保存状态。

1.1.1 session在不同环境下的不同含义
  session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。
然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义。
  session在Web开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。

1.1.2 保存session id的几种方式
A.保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
如果客户端支持Cookie,Web Server在返回Response的时候,在Response的Header部分,加入一个“set-cookie: jsessionid=XXXX”header属性,把jsessionid放在Cookie里传到客户端。
B.由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
C.另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。

1.1.3 URL重写有什么缺点
   对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。
   这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servlet或JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSION ID已经过期了。

1.1.4 使用隐藏的表单域有什么缺点
仅当每个页面都是有表单提交而动态生成时,才能使用这种方法。单击常规的<A HREF..>超文本链接并不产生表单提交,因此隐藏的表单域不能支持通常的会话跟踪,只能用于一系列特定的操作中,比如在线商店的结账过程。

1.1.5 session什么时候被创建
一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。

1.1.6 session何时被删除
session在下列情况下被删除:
A.程序调用HttpSession.invalidate()
B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
C.服务器进程被停止

再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。

1.2 Cookie对象
浏览器向服务器发送请求时,服务器会将少量的数据返回给浏览器(该数据以set-cookie消息头的形式返回给浏览器),浏览器会将这些数据存放到硬盘或者内存上。当浏览器下次再次访问服务器时,会将之前存放的数据发送给服务器(以cookie消息头的形式发送给服务器)。通过这种方式,就可以记录浏览器与服务器之间交互的数据,也就是状态。

1.2.1 会话cookie和持久cookie的区别
如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
  如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。
  存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。

2.Session和Cookie的关系
这里用一个形象的比喻来解释session的工作方式。假设
  • Web Server:是一个商场的存包处
  • HTTP Request:是一个顾客
  • Session:商场的存包处的柜子
  • Session ID:存包号码牌
  • Cookie:客户随身携带不离身的钱包
情况一:一个顾客(HTTP Request),第一次来到存包处(Web Server),管理员把顾客的物品存放在某一个柜子里面(Session),然后把一个号码牌(Session ID)交给这个顾客,作为取包凭证。
情况二:顾客(HTTP Request)下一次来的时候,就要把号码牌(Session ID)交给存包处(Web Server)的管理员。管理员根据号码牌(Session ID)找到相应的柜子(Session),根据顾客(HTTP Request)的请求,存包处(Web Server)可以取出、更换、添加柜子(Session)中的物品,存包处(Web Server)也可以让顾客(HTTP Request)的号码牌和号码牌对应的柜子(Session)失效。
情况三:顾客(HTTP Request)的忘性很大,管理员在顾客回去的时候(HTTP Response)都要重新提醒顾客记住自己的号码牌(Session ID)。这样,顾客(HTTP Request)下次来的时候,就又带着号码牌回来了。
情况四:客户(HTTP Request)把拿到的号码牌(Session ID)放到随身携带不离身的钱包(Cookie)中。

3.Session和Cookie的应用
3.1 如何利用实现自动登录
当用户在某个网站注册后,就会收到一个惟一用户ID的cookie。客户后来重新连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户务需给出明确的用户名和密码,就可以访问服务器上的资源。

3.2 如何根据用户的爱好定制站点
网站可以使用cookie记录用户的意愿。对于简单的设置,网站可以直接将页面的设置存储在cookie中完成定制。然而对于更复杂的定制,网站只需仅将一个惟一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。

3.3 cookie的发送
    1) 创建Cookie对象
    2) 设置最大时效
    3) 将Cookie放入到HTTP响应报头
如果你创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie:存储在浏览器的内存中,用户退出浏览器之后被删除。如果你希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个Set-Cookie HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此我们将这个方法称为是addCookie,而非setCookie。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。
Cookie cookie = new Cookie("duanqftest", "22222");  
cookie.setDomain("172.20.40.73");  
cookie.setMaxAge(60000);  
cookie.setPath("/");  
response.addCookie(cookie); 
javax.servlet.http.Cookie[] diskCookies = request.getCookies();  
response.sendRedirect("ReadCookie");

3.4 cookie的读取
1) 调用request.getCookie
要获取有浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。
2) 对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止
cookie与你的主机(域)相关,而非你的servlet或JSP页面。因而,尽管你的servlet可能只发送了单个cookie,你也可能会得到许多不相关的cookie。
String cookieName = “userID”;
Cookie cookies[] = request.getCookies();
if (cookies!=null)
{
    for(int i=0;i<cookies.length;i++)
    {
        Cookie cookie = cookies[i];
        if (cookieName.equals(cookie.getName()))
            doSomethingWith(cookie.getValue());
    }
}

3.5 如何使用cookie检测初访者
    A.调用HttpServletRequest.getCookies()获取Cookie数组
    B.在循环中检索指定名字的cookie是否存在以及对应的值是否正确
    C.如果是则退出循环并设置区别标识
    D.根据区别标识判断用户是否为初访者从而进行不同的操作

3.6 使用cookie检测初访者的常见错误
不能仅仅因为cookie数组中不存在在特定的数据项就认为用户是个初访者。如果cookie数组为null,客户可能是一个初访者,也可能是由于用户将cookie删除或禁用造成的结果。
但是,如果数组非null,也不过是显示客户曾经到过你的网站或域,并不能说明他们曾经访问过你的servlet。其它servlet、JSP页面以及非Java Web应用都可以设置cookie,依据路径的设置,其中的任何cookie都有可能返回给用户的浏览器。
正确的做法是判断cookie数组是否为空且是否存在指定的Cookie对象且值正确。

3.7 使用cookie属性的注意问题
属性是从服务器发送到浏览器的报头的一部分;但它们不属于由浏览器返回给服务器的报头。 
  因此除了名称和值之外,cookie属性只适用于从服务器输出到客户端的cookie;服务器端来自于浏览器的cookie并没有设置这些属性。 
  因而不要期望通过request.getCookies得到的cookie中可以使用这个属性。这意味着,你不能仅仅通过设置cookie的最大时效,发出它,在随后的输入数组中查找适当的cookie,读取它的值,修改它并将它存回Cookie,从而实现不断改变的cookie值。

3.8 如何使用cookie记录各个用户的访问计数
    1) 获取cookie数组中专门用于统计用户访问次数的cookie的值
    2) 将值转换成int型
    3) 将值加1并用原来的名称重新创建一个Cookie对象
    4) 重新设置最大时效
    5) 将新的cookie输出

3.9 会话跟踪的基本步骤
    1) 访问与当前请求相关的会话对象
    2) 查找与会话相关的信息
    3) 存储会话信息
    4) 废弃会话数据

3.10 getSession()/getSession(true)、getSession(false)的区别
getSession()/getSession(true):当session存在时返回该session,否则新建一个session并返回该对象。
getSession(false):当session存在时返回该session,否则不会新建session,返回null。
分享到:
评论

相关推荐

    免费超全面的Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结

    java基础 一、仓库说明 Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结。 2、分类文档 ...会话跟踪技术,Session和Cookie详解 过滤器、监听器、拦截器,应用详解 Servlet 集成 C3P0

    python-learning.zip

    整理了python从基础入门到高级进阶的所有资料: 01.初识Python.md 02.语言元素.md 03.分支结构.md 04.循环结构.md ...44.Cookie和Session.md 45.制作报表.md 46.日志和调试工具栏.md 47.中间件的应用.md 48.前...

    net学习笔记及其他代码应用

    6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? 答 : this.Server.Transfer 7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? ...

    PHP网络编程技术与实践 源码

    第8章 用户会话管理Cookie和Session 8.1 Cookie的使用 8.1.1 Cookie简介及其工作原理 8.1.2 设置Cookie变量 8.1.3 接收和处理Cookie 8.1.4 删除Cookie变量 8.1.5 Cookie的有效范围和生存周期 8.2 Session的使用 ...

    Java常见面试题208道.docx

    67.session 和 cookie 有什么区别? 68.说一下 session 的工作原理? 69.如果客户端禁止 cookie 能实现 session 还能用吗? 70.spring mvc 和 struts 的区别是什么? 71.如何避免 sql 注入? 72.什么是 XSS 攻击,...

    JAVA面试题最全集

    描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理。 5.列出Jsp中包含外部文件的方式,两者有何区别。 6.说明Jsp中errorPage的作用,应用范围。 7.介绍在Jsp中如何使用JavaBeans。 8.简单介绍...

    Java-Web:整理一套java web知识体系,从java入门到框架应用等

    整理一下会话的知识点,包含:cookie,session,token 锁包括重量级锁、自旋锁、轻量级锁、偏向锁、悲观、乐观锁等各种锁,这里逐个进行介绍。 线程的方方面面。 zookeeper zookeeper主要功能包括:配置维护、域名...

    asp.net知识库

    ASP.NET 2.0构建动态导航的Web应用程序(TreeView和Menu ) 体验.net2.0的优雅(3) -- 为您的 SiteMap 添加 控制转发功能 GridView控件使用经验 ASP.NET 2.0:弃用 DataGrid 吧,有新的网格控件了! ASP.NET2.0控件...

    Java学习笔记-个人整理的

    {14.3.1}SAX应用}{206}{subsection.14.3.1} {14.4}dom4j}{207}{section.14.4} {14.5}XPath}{210}{section.14.5} {14.6}apache.commons}{211}{section.14.6} {15}sqlite3}{213}{chapter.15} {16}Web基础}{215}{...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    jQuery 和Dom关系及jQuery版本 jQuery选择器 实例多选反选取消 删选器以及Tab菜单示例 示例:模态编程框 jQuery 样式以及属性操作 示例:TAB切换菜单 jQuery内容操作 点赞以及jQuery css操作 JQuery高度以及位置操作...

    python入门到高级全栈工程师培训 第3期 附课件代码

    06 COOKIE和SESSION配合使用 第54章 01 今日内容概要 02 Django内容回顾 03 Django请求生命周期之Http请求 04 Django请求生命周期之FBV和CBV 05 Django请求生命周期之CBV扩展 06 瞎扯淡 07 Django请求生命周期之...

    《ASP.NET与数据库程序设计》

    5-1-2前端与后端的差别 5-2使用Access及SQL的重点 5-2-1系统规划概述 5-2-1使用Access的注意事项 5-2-2使用SQL Server的注意事项 5-2-3安全考量应有设计 Access文件的位置 SQL的超级使用...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    ASP.Net MVC是微软推出的区别于ASP.Net WebForm的Web开发新技术,由于ASP.Net MVC解决了ASP.Net WebForm的很多缺点,非常适合大型、中型项目的开发,一经推出就受到了.Net开发社区的追捧,很多.Net开发人员的职位...

Global site tag (gtag.js) - Google Analytics