`
啸笑天
  • 浏览: 3460997 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

Session,Cookie,jsessionid,Url重写

    博客分类:
  • jsp
阅读更多

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

 

分享到:
评论
3 楼 vivian123an 2016-07-25  
  
2 楼 wenxueld 2015-07-03  
1 楼 wenxueld 2015-07-03  
[color=red][/color]

相关推荐

    session与cookie.doc的区别

    4. **依赖性**:Session依赖于Cookie,如果客户端禁用Cookie,服务器可以通过URL重写技术传递SessionID,但这样会对URL产生污染,用户体验可能下降。 5. **安全性**:由于Session数据存储在服务器,相对Cookie来说...

    session和cookie详解

    当用户首次访问服务器时,服务器会创建一个唯一的Session ID,并将其存储为一个名为`JSESSIONID`的Cookie发送给客户端。之后的每次请求,客户端都会携带这个Session ID。服务器根据Session ID来查找相应的会话数据,...

    session的实现方式

    通过 Cookie 可以很好地实现 Session,但是如果客户端由于某些原因(比如出于安全考虑)而禁用 Cookie,在这种情况之下,为了使 Session 能够继续生效,可以采用 URL 重写。URL 重写很简单,比如我要从 1.jsp 页面...

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

    每个Session都关联一个唯一的Session ID,这个ID通过Cookie或者URL重写等方式发送到客户端。客户端每次请求时,服务器根据Session ID找到对应的Session数据,实现用户会话的维护。在JavaWeb中,我们使用HttpSession...

    session编程(包括禁用cookie的情况)

    如果Cookie被禁用,我们可以通过URL重写或者隐藏表单字段的方式来传递Session ID。URL重写是将Session ID附加到URL路径或查询字符串中;隐藏表单字段则是在HTML表单中添加一个不可见的输入元素,用于存储Session ID...

    理解session机制

    如果客户端禁用了Cookie,服务器可以通过URL重写或表单隐藏字段的方式来传递Session ID。URL重写是在URL路径或查询字符串中附加Session ID,而表单隐藏字段则是在HTML表单中添加一个隐藏的输入元素,用于在表单提交...

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

    2. **URL重写传递Session ID**:通过脚本语言(如JSP)重定向页面时,将Session ID附加在URL中,如: ```jsp &lt;% String sid = session.getId(); response.sendRedirect("xxxx123.jsp;jsessionid=" + sid); %&gt; ...

    session的生命周期1

    综上所述,`Session`是Web应用中维持用户状态的关键工具,依赖于`Cookie`进行标识,但在无`Cookie`环境下,通过URL重写也能保持其功能。了解`Session`的工作原理对于优化Web应用性能和用户体验至关重要。

    08-Session-Tracking-Chinese.pdf

    Cookie sessionCookie = new Cookie("JSESSIONID", sessionID); sessionCookie.setPath("/"); response.addCookie(sessionCookie); ``` - **注意事项:** - 需要设置Cookie的过期时间,以确保安全性。 - 在每次请求...

    session介绍

    - **传递**:Session ID通常通过Cookie或者URL重写的方式传递给客户端。如果客户端支持Cookie,服务器会将Session ID作为一个名为"SESSIONID"(或其他类似名称)的Cookie发送给浏览器。如果客户端禁用了Cookie,...

    servlet中关于session的理解

    2. **URL重写(URL Rewriting)**:当服务器检测到客户端不支持Cookies时,它会通过URL重写的方式来传递Session ID。具体来说,服务器会在响应中返回的URL后面加上`;JSESSIONID=xxxxx`这样的参数,从而在客户端请求...

    Session页面之间 传值

    如果不希望使用Cookie或者客户端禁用了Cookie功能,可以考虑使用URL重写(URL rewriting)作为替代方案,但这通常会导致URL变得比较复杂且不友好。 #### 知识点六:Session在不同页面间的传递 Session的主要用途之...

    6 jsp内建对象之session

    每个用户在访问网站时会被分配一个唯一的会话ID(session ID),这个ID通过cookie或者URL重写等方式在客户端和服务器之间传递,使得服务器能够识别并跟踪特定用户的活动。 **二、session的工作原理** 当用户首次...

    java中使用session购物车的简单例子

    - 鉴于Session依赖Cookie,禁用Cookie的用户可能无法正常使用基于Session的功能,开发者需要提供替代方案,如URL重写。 - 为了提高性能和扩展性,大型应用往往不直接存储大量数据在Session中,而是用Session作为用户...

    彻底解决android用HttpUrlConnection与web服务器之间session保持问题

    - **Session**:是服务器端的状态保持机制,服务器为每个客户端创建一个唯一的Session ID,并通过Cookie或URL回写的方式将其发送给客户端。客户端再次请求时,通过携带Session ID,服务器就能识别出是同一个用户,...

    Java Web学习之Cookie和Session的深入理解

    "Java Web学习之Cookie和Session的深入理解...答案是不能,绝大多数的网站是这样,原因是没有使用URL重写机制来解决Cookie被禁用的问题。 * Cookie可以用来实现购物车功能吗?答案是可以,Session能做的Cookie也能做。

    使用session实现用户登录共4页.pdf.zip

    - **会话跟踪**:除了Cookie,还可以使用URL重写或者隐藏表单字段来传递Session ID,但Cookie是最常见的方法。 - **安全性**:需要注意Session劫持和Session固定攻击,可以通过使用HTTPS、定期更换Session ID、...

    Session和Cookies的区别

    - **限制**:虽然可以尝试设置 Session 的最大空闲时间,但由于依赖名为 JSESSIONID 的 Cookie,其默认有效期为浏览器关闭即失效。 - **问题**:设置过长的 Session 生存期可能导致服务器内存消耗过大。 #### 五、...

Global site tag (gtag.js) - Google Analytics