- 浏览: 100469 次
- 性别:
- 来自: 武汉
最新评论
-
zljerityzljerity:
<#assign ipage=page?number&g ...
freeMark全解 -
qiankai86:
...
freeMark全解
Session,Cookie,jsessionid和Url重写
故障描述:
人员管理系统(A)内嵌到权限系统(B),B系统通过Servlet模拟登陆,并将登陆信息缓存到A系统的Session中,已保证A系统Sessino检查成功。有个别用户从B系统第一次通过Servlet跳转访问A系统时,A系统Session效验失效。将浏览器Internate选项->隐私设为低时,A系统Session效验成功。
故障分析:
故障现象和浏览器的隐私选项有关。根据浏览器隐私选项的描述,该选项和系统Cookie有关,通过HttpLook进行抓包,发现B系统通过Servlet跳转时,缺少jsessionid信息。另外,通过A系统所配置的HttpSessionListener监听,发现正常情况下只创建了一个Session,异常情况下则反复创建和销毁Session。初步断定故障问题和Cookie,jsessionid,Session有关。
Google一把
首先是IE对隐私选项的说明:
您可能已知道了 Web 站点可能通过使用 Cookie 搜集有关您的 Web 浏览习惯的信息。Internet Explorer 6 可以帮助保护您的隐私,它给您提供了一些工具以查找搜集此类信息的 Web 站点以及 Internet Explorer 在未征得您明确同意的情况下可以接受哪些种类的 Cookie。
Internet Explorer 6 可以使用以下方法帮助您保护隐私:
? 管理 Cookie。了解什么是 Cookie 以及如何使用 Internet Explorer 隐私设置来控制 Web 站点在未征得您同意的情况下在您的计算机中放置哪些 Cookie。
? 检查 Web 站点隐私策略。了解什么是隐私策略以及如何使用它来帮助联机保护您的隐私。
什么是 Cookie?
它并非字面所代表的含义。这些是虚拟 Cookie—这是 Web 站点在您的计算机上创建的一些小文本文件,这些文件用于存储搜集的有关您的站点访问信息,其中包括访问的站点、执行的操作以及提供的任何个人信息。Web 站点还可能允许其他 Web 站点(例如,其广告商)在您的计算机上放置 Cookie(称为第三方 Cookie)。
Cookie 是使用 Web 所必需的部件。Web 站点使用 Cookie 中的信息来提供个性化的内容(当地新闻和天气、热销产品等)、完成交易(例如,用于联机银行或购物)以及搜集统计数据。但是,Web 站点仅有权访问您提供的个人信息;或者,它只记录您在该站点所执行的操作,因此使您保持匿名。
告诉 Internet Explorer 如何管理 Cookie
Internet Explorer 给您提供了很多管理 Cookie 的选项—从接受发给您的所有 Cookie 到阻止所有 Cookie(可能会增加 Web 使用的难度)。
在第一次安装 Internet Explorer 时,Internet Explorer 设置中等程度的隐私级别。此隐私设置允许使用 Cookie,但有一些限制—例如,它阻止某些第三方 Cookie。但是,Internet Explorer 将控制权交给您,因此,您可以进一步限制对 Cookie 的使用,或者指示 Internet Explorer 放宽接受的 Cookie 种类的范围。
隐私设置只影响 Internet 区域中的 Web 站点,Internet 区域是 Internet Explorer 放置所有 Web 站点的安全区域(除非另有指定)。阅读有关安全区域和设置的信息。
1.在 Internet Explorer“工具”菜单上,单击“Internet 选项”。
2.单击“隐私性”选项卡,并向上拖动滑块以获得更高的隐私级别(对 Cookie 的限制更大),或者向下拖动滑块以获得更低的隐私级别。
“Internet 选项”框
小心!如果您选择阻止所有 Cookie,则可能无法利用站点自定义功能,甚至无法访问某些 Web 站点。
然后是Session,Cookie,jsessionid的关系
由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了。
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是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。IETF RFC 2965 HTTP State Management Mechanism 是通用cookie规范。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies
cookie和session机制区别与联系
具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。
cookie机制。正统的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机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个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.
故障解决:
在B系统跳转到A系统的Servlet里使用response.encodeURL()进行URL重写,故障解决。
遗留问题:
为什么故障现象在浏览器隐私选项设置相同情况下,会出现有的正常有的不正常的情况
发表评论
-
ofbiz 之entity实体
2014-03-25 18:16 938ofbiz 之entity实体 1. 实体定义文件 实体定 ... -
ofbiz迷你语言
2012-08-08 17:13 2297simple-map-processor 和 sim ... -
ofbiz之entity 实体解析
2012-08-08 17:12 1505ofbiz 之entity实体 1. 实体定义文件 实体定 ... -
ofbiz之旅-实体简介(中英译)
2012-08-09 09:34 1167OFBIZ ENTITY ENGINE COOKBOOK = ... -
OFBIz之旅[结构]
2012-08-08 17:03 1481OFBIz之旅[结构] 注意: 1,持久层,在OFBI ... -
java concurrent 探秘(2)
2011-08-08 14:21 912java concurrent 探秘(2) Blo ... -
java concurrent 探秘
2011-08-08 11:02 820java concurrent 探秘 我们都知道,在JD ... -
one-to-one 一对一主键关联映射_单向
2011-08-03 17:22 1309one-to-one 一对一主键关联映射_单向 一对一主键关 ... -
JavaScript验证正则表达式大全
2011-07-27 17:18 913上篇文章《JavaScript验证正则表达式大全》说的是jav ... -
JavaScript验证正则表达式大全
2011-07-27 17:17 826JavaScript验证正则表达式大全 JavaScript验 ... -
js 收集1
2011-01-14 09:49 10541.javascript的数组API Js代码 ... -
struts 核心解析
2010-12-03 14:25 2443一、概述 Struts2的核心是一个Fil ... -
Java类库中的集合类解析
2010-11-29 16:05 1085这篇我准备从源码的高度来看看集合中各个实现类的是如何组织我们存 ... -
jboss classloader机制以及scope配置
2010-11-29 15:06 17111. 概念介绍 UCL : org.jboss.mx. ... -
总结和对比一下(jboss,tomcat,jetty)容器的classloader机制
2010-11-29 14:58 1974总结和对比一下(jboss,tomcat,je ... -
jboss,tomcat,jetty 容器的classloader机制
2010-11-29 14:53 4572背景 前段时间一直在做应用容器的迁移,将公司的应用 ... -
DWR work
2010-11-25 18:14 887这段时间较闲,研究了一 ... -
CXF jaxws spring configuration
2010-11-19 16:27 1591最近在cxf-zh中有人问及了有关Spring配置CXF Cl ... -
线程安全总结2
2010-11-17 16:48 815站内很多人都问我,所谓线程的“工作内存”到底是个什么东西? ... -
java线程安全总结1
2010-11-17 16:47 882最近想将java基础的一些 ...
相关推荐
当用户首次访问服务器时,服务器会创建一个唯一的Session ID,并将其存储为一个名为`JSESSIONID`的Cookie发送给客户端。之后的每次请求,客户端都会携带这个Session ID。服务器根据Session ID来查找相应的会话数据,...
4. **依赖性**:Session依赖于Cookie,如果客户端禁用Cookie,服务器可以通过URL重写技术传递SessionID,但这样会对URL产生污染,用户体验可能下降。 5. **安全性**:由于Session数据存储在服务器,相对Cookie来说...
每个Session都关联一个唯一的Session ID,这个ID通过Cookie或者URL重写等方式发送到客户端。客户端每次请求时,服务器根据Session ID找到对应的Session数据,实现用户会话的维护。在JavaWeb中,我们使用HttpSession...
通过 Cookie 可以很好地实现 Session,但是如果客户端由于某些原因(比如出于安全考虑)而禁用 Cookie,在这种情况之下,为了使 Session 能够继续生效,可以采用 URL 重写。URL 重写很简单,比如我要从 1.jsp 页面...
如果Cookie被禁用,我们可以通过URL重写或者隐藏表单字段的方式来传递Session ID。URL重写是将Session ID附加到URL路径或查询字符串中;隐藏表单字段则是在HTML表单中添加一个不可见的输入元素,用于存储Session ID...
通过适当调整响应头策略或改用URL重写传递Session ID的方法,可以有效规避这些问题,确保用户会话的一致性和安全性。然而,每种解决方案都有其优缺点,开发者应根据实际情况权衡利弊,选择最适合的策略。
如果客户端禁用了Cookie,服务器可以通过URL重写或表单隐藏字段的方式来传递Session ID。URL重写是在URL路径或查询字符串中附加Session ID,而表单隐藏字段则是在HTML表单中添加一个隐藏的输入元素,用于在表单提交...
综上所述,`Session`是Web应用中维持用户状态的关键工具,依赖于`Cookie`进行标识,但在无`Cookie`环境下,通过URL重写也能保持其功能。了解`Session`的工作原理对于优化Web应用性能和用户体验至关重要。
2. **URL重写(URL Rewriting)**:当服务器检测到客户端不支持Cookies时,它会通过URL重写的方式来传递Session ID。具体来说,服务器会在响应中返回的URL后面加上`;JSESSIONID=xxxxx`这样的参数,从而在客户端请求...
- **传递**:Session ID通常通过Cookie或者URL重写的方式传递给客户端。如果客户端支持Cookie,服务器会将Session ID作为一个名为"SESSIONID"(或其他类似名称)的Cookie发送给浏览器。如果客户端禁用了Cookie,...
如果不希望使用Cookie或者客户端禁用了Cookie功能,可以考虑使用URL重写(URL rewriting)作为替代方案,但这通常会导致URL变得比较复杂且不友好。 #### 知识点六:Session在不同页面间的传递 Session的主要用途之...
Cookie sessionCookie = new Cookie("JSESSIONID", sessionID); sessionCookie.setPath("/"); response.addCookie(sessionCookie); ``` - **注意事项:** - 需要设置Cookie的过期时间,以确保安全性。 - 在每次请求...
- 鉴于Session依赖Cookie,禁用Cookie的用户可能无法正常使用基于Session的功能,开发者需要提供替代方案,如URL重写。 - 为了提高性能和扩展性,大型应用往往不直接存储大量数据在Session中,而是用Session作为用户...
每个用户在访问网站时会被分配一个唯一的会话ID(session ID),这个ID通过cookie或者URL重写等方式在客户端和服务器之间传递,使得服务器能够识别并跟踪特定用户的活动。 **二、session的工作原理** 当用户首次...
- **限制**:虽然可以尝试设置 Session 的最大空闲时间,但由于依赖名为 JSESSIONID 的 Cookie,其默认有效期为浏览器关闭即失效。 - **问题**:设置过长的 Session 生存期可能导致服务器内存消耗过大。 #### 五、...
- **Session**:是服务器端的状态保持机制,服务器为每个客户端创建一个唯一的Session ID,并通过Cookie或URL回写的方式将其发送给客户端。客户端再次请求时,通过携带Session ID,服务器就能识别出是同一个用户,...
"Java Web学习之Cookie和Session的深入理解...答案是不能,绝大多数的网站是这样,原因是没有使用URL重写机制来解决Cookie被禁用的问题。 * Cookie可以用来实现购物车功能吗?答案是可以,Session能做的Cookie也能做。
- **会话跟踪**:除了Cookie,还可以使用URL重写或者隐藏表单字段来传递Session ID,但Cookie是最常见的方法。 - **安全性**:需要注意Session劫持和Session固定攻击,可以通过使用HTTPS、定期更换Session ID、...