在一些投票之类的场合,我们往往因为公平的原则要求每人只能投一票,在一些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了。

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

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

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

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

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

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

  从网络服务器观点看所有HTTP请求都独立于先前请求。就是说每一个HTTP响应完全依赖于相应请求中包含的信息状态管理机制克服了HTTP的一些限制并允许网络客户端及服务器端维护请求间的关系。在这种关系维持的期间叫做会话(session)。

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

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

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>

什么是Url重写?

服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。

可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。

实质上 URL 重写是通过向 URL 连接添加参数,并把 session ID 作为值包含在连接中。然而,为使这生效,你需要为你的 servlet 响应部分的每个连接添加 session ID.

利用Url进行Session重写如何实现?

JSP实现

把 session ID 加到一个连接可以使用一对方法来简化:response.encodeURL() 使 URL包含 session ID,如果你需要使用重定向,可以使用 response.encodeRedirectURL ()来对 URL 进行编码。encodeURL () 及 encodeRedirectedURL () 方法首先判断 cookie是否被浏览器支持;如果支持,则参数 URL 被原样返回,session ID 将通过 cookies 来维持。

代码示例:

不使用Url重写:<a href=http://wwww.myserver.com/servelet/user;userName=awaysrain>Link</a>

使用Url重写:通过HttpServletResponse接口中的encodeURL()方法编码.

String myURL = response.encodeURL(http://wwww.myserver.com/servelet/user);

<a href= <%=myURL%> _fcksavedurl=" <%=myURL%>" _fcksavedurl=" <%=myURL%>" _fcksavedurl=" <%=myURL%>" >

JSTL实现

<c:url>可以为会话管理重写 URL

<a href="<c:url value='/content/sitemap.jsp'/>">View sitemap</a>

Struts实现:

struts配置文件中:设置属性redirect, contextRelative

<forward name="listArticlesForBlog"

path="/template/listArticlesForBlog.jsp"

redirect="true"

contextRelative="true"/>

最后一个比较搞的问题:

那么在浏览器允许cookie的情况下,不要求浏览器关闭cookie的情况下使用

url重写如何实现?

http://tomcat.apache.org/tomcat-5.5-doc/config/context.html

Context支持cookies参数。 设置cookies="false",强制只从url解析sessionid。

cookies

Set to true if you want cookies to be used for session identifierContext

communication if supported by the client (this is the default). Set to

false if you want to disable the use of cookies for session identifier

communication, and rely only on URL rewriting by the application.

sessions 与cookies相关推荐

  1. Servlet - Sessions and Cookies

    Sessions and Cookies 1. What 1.1 Session定义 1.2 Cookie定义 2. Why 3. How 4. Samples 4.1 Cookie的基本使用 4.2 ...

  2. java 存储关系网络_java网络通信:HTTP协议 之 Sessions与Cookies

    通过前一篇博客的讲解,我们大体知道了HTTP协议是什么,它有什么组成,以及它的工作原理,那么在HTTP的很多特点中,有一点叫做,无状态,就HTTP是一个无状态的协议,如果需要前面的信息用于处理后边的请 ...

  3. Cookies vs. Sessions

    Cookies: 存储在客户端浏览器,如果客户不删除,它将不会丢失. Sessions:存储在服务器端,这样的话如果你是有多台服务器,那么就会导致,访问此服务器的有Sessions,但访问另外一个没有 ...

  4. PHP - Sessions

    转载自:http://www.tutorialspoint.com/php/php_sessions.htm An alternative way to make data accessible ac ...

  5. Go实战--Gorilla web toolkit使用之gorilla/sessions(iris+sessions)

    生命不止,继续go go go!!! 昨天介绍了: Go实战–Gorilla web toolkit使用之gorilla/context 今天介绍gorilla/sessions: Package s ...

  6. Yii--Sessions 和 Cookies

    Sessions 和 cookies 允许数据在多次请求中保持, 在纯 PHP 中,可以分别使用全局变量 $_SESSION 和 $_COOKIE 来访问,Yii 将 session 和 cookie ...

  7. http编程学习(C#)

    <HTTP Programming Recipes for C# Bots> 第一章 选择GET还是POST取决于传送到服务器的数据的多少.GET传送的数据少,POST几乎对传送的数据无限 ...

  8. 前端 要了解是的事情

    界面和用户体验(Interface and User Experience) 知道各大浏览器执行Web标准的情况,保证你的站点在主要浏览器上都能正常运行.你至少要测试以下引擎:Gecko(用于Fire ...

  9. Java必会的面试题

    基础题目 1. Java线程的状态 Java的线程在某个时刻只能处于以下六个状态中的一个. 新(新创建),一个线程刚刚被创建出来,还没有开始运行的状态,更通俗点说:还没有调用启动方法; Runnabl ...

最新文章

  1. NET问答: JS 中有 LINQ SelectMany 方法的等价实现吗?
  2. android 导航 美国,变美了 Android N或用全新虚拟导航按键
  3. CF765F Souvenirs(势能线段树)
  4. 李宏毅机器学习(八)ELMo、BERT、GPT、XLNet、MASS、BART、UniLM、ELECTRA、others
  5. Redis五大基本数据类型及其相关命令及常用用途
  6. centos解压分卷rar_centos解压和压缩rar格式文件
  7. jquery类操作和className的区别
  8. [转载] Pytorch入门实战-----逻辑回归识别手写数据集
  9. 冲着名为Sundy的男人去麦子学院
  10. ros系统能用c语言编程,ROS操作系统学习(十一)参数的使用与编程方法
  11. python5个标准库,列出5个python标准库
  12. 高通Camera驱动(1)--Camx架构介绍
  13. html5创建桌面快捷方式,iOS APP创建桌面快捷方式
  14. VMare虚拟机无法识别USBkey问题
  15. lol英雄皮肤图片爬取
  16. 穷人python入门教程视频_《穷》字意思读音、组词解释及笔画数 - 新华字典 - 911查询...
  17. mysql代码导出excel_数据库导出excel代码
  18. 关于移动硬盘无法被识别的其中一种解决办法
  19. 微信公众号 用户绑定 php,微信公众号开发——网页授权实现简化用户绑定
  20. php mysql条数不对_为什么PHP从MySQL中取出的数据总是少了一条?

热门文章

  1. UML的概念和模型之UML九种图
  2. 我的Windows8体验
  3. 工业相机千兆网线和USB优劣对比
  4. 【Kaggle笔记】良/恶性乳腺肿瘤数据(线性分类)
  5. android beam功能,让NFC更实用 Android Beam评测
  6. 阿里云短信验证码服务使用(java ssm为例)
  7. 理解离散傅立叶变换(一)——傅立叶变换的由来
  8. 全球与中国PVD真空镀膜设备市场深度研究分析报告
  9. rocketMQ启动可视化页面没有主题(Topic)的问题
  10. 交叉线、直通线背后掩藏着什么?