SESSION的知识

android模拟表单用到了httpclient,可是须要了解Jsessionid的相关知识android

以下是从一篇博文摘抄来的
在web应用的开发中咱们会常常看到这样的url:http://www.xxx.com/xxx_app;jsessionid=xxxxxxxxxx?a=x&b=x...。这跟通常的url基本同样,只有一个地方有区别,那就是“;jessionid=xxxxxxxx”。这个参数有时候有,有时候又没有,说它是参数可又跟通常传递的参数不一样,它是紧跟在url后面用分号来分隔的,用通常的request.getParameter()方法还取不到。那这个参数究竟是干吗用的呢?要了解它还要先了解session的实现方式。
session的实现方式
作web开发的同窗都知道,http是无状态的会话协议,也就是说没法保存用户的信息。那若是有一些信息须要在用户的浏览活动中一直保持,该怎么作呢?咱们能够把这些信息在每次请求的时候做为参数传递给服务器,但这样作既麻烦又耗费资源,这时候就体现出了session的重要性。session是web开发中不可或缺的一个特性。它是对于一个特定的用户请求,在web服务器上保存的一个全局变量。有了它咱们就能够把用户的一些信息保存在服务器上,而不用在服务器和客户端之间来回传递。知道了session的做用,那session是怎么实现的呢?服务器上为每一个用户都保存了一个session,那当用户请求过来的时候是怎么知道某一个用户应该对应哪一个session呢?这时jsessionid就派上用场了。每个session都有一个id来做为标识,这个id会传到客户端,每次客户端请求都会把这个id传到服务器,服务器根据id来匹配此次请求应该使用哪一个session。jsessionid就是客户端用来保存sessionid的变量,主要是针对j2ee实现的web容器,没有研究过其余语言是用什么变量来保存的。通常对于web应用来讲,客户端变量都会保存在cookie中,jsessionid也不例外。不过与通常的cookie变量不一样,jsessionid是保存在内存cookie中的,在通常的cookie文件中是看不到它的影子的。内存cookie在打开一个浏览器窗口的时候会建立,在关闭这个浏览器窗口的时候也同时销毁。这也就解释了为何session变量不能跨窗口使用,要跨窗口使用就须要手动把jsessionid保存到cookie里面。
jsessionid的做用
在以上的文字中咱们了解了session的实现原理,同时也知道了session跟jsessionid紧密不可分割的联系。只有经过jsessionid才能使session机制起做用,而jsessionid又是经过cookie来保存。看到这里,也许你会发现一个问题,若是用户禁用了cookie,那jsessionid不是就不能保存了吗?session不是不起做用了吗?咱们真的对此一筹莫展了吗?固然不是。在用户禁用了cookie时候,咱们能够经过url重写来实现jsessionid的传递。这就是我上面指出的那样的url:http://www.xxx.com/xxx_app;jsessionid=xxxxxxxxxx?a=x&b=x..。jessionid经过这样的方式来从客户端传递到服务器端,从而来标识session。注意一点,jsessionid跟通常的url参数传递方式是不一样的,不是做为参数跟在?后面,而是紧跟在url后面用;来分隔。这样在用户禁用cookie的时候咱们也能够传递jsessionid来使用session了,只不过须要每次都把jseesionid做为参数跟在url后面传递。那这样岂不是很麻烦,每次请求一个url都要判断cookie是否可用,若是禁用了cookie,还要从url里解析出jsessionid,而后跟在处理完后转到的url后面,以保持jsessionid的传递。这些问题sun固然已经帮咱们想到了,因此提供了2个方法来使事情变得简单:response.encodeURL()和response.encodeRedirectURL()。这2个方法会判断cookie是否可用,若是禁用了会解析出url中的jsessionid,并链接到指定的url后面,若是没有找到jessionid会自动帮咱们生成一个。至于为何要有2个方法?这2个方法有什么不一样?google了一下,说是这2个方法在判断是否要包含jsessionid的逻辑上会稍有不一样。在调用HttpServletResponse.sendRedirect前,应该先调用encodeRedirectURL()方法,不然可能会丢失Sesssion信息。这2个方法的使用方法如:response.sendRedirect(response.encodeURL("/myapp/input.jsp"));。若是cookie没有禁用,咱们在浏览器地址栏中看到的地址是这样的:/myapp/input.jsp,若是禁用了cookie,咱们会看到:/myapp/input.jsp;jsessionid=73E6B2470C91A433A6698C7681FD44F4。因此,咱们在写web应用的时候,为了保险起见,应该在程序里的每个跳转url上都使用这2个方法,来保证session的可用性。
说道这里,你们应该对jsessionid和session的关系,以及jsessionid的做用有个了一个大体的了解,具体应用还要本身在项目中具体状况具体对待。

=============================================================================================

jsessionid=CA72488F94BC8A3E92FEEDA8CC736FDC       这个jsessionid是session的一个标识。       我在这里转贴jdbc老大的部分讲解       session机制是一种服务器端的机制,服务器使用一种相似于散列表的结构(也可能就是使用散列表)来保存信息。       当程序须要为某个客户端的请求建立一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,若是已包含一个session id则说明之前已经为此客户端建立过session,服务器就按照session id把这个 session检索出来使用(若是检索不到,可能会新建一个),若是客户端请求不包含session id,则为此客户端建立一个session而且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。       保存这个session id的方式能够采用cookie,这样在交互过程当中浏览器能够自动的按照规则把这个标识发挥给服务器。通常这个cookie的名字都是相似于SEEESIONID,而。好比weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。       因为cookie能够被人为的禁止,必须有其余机制以便在cookie被禁止时仍然可以把session id传递回服务器。常常被使用的一种技术叫作URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是做为URL路径的附加信息,表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764另外一种是做为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764这两种方式对于用户来讲是没有区别的,只是服务器在解析的时候处理的方式不一样,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。为了在整个交互过程当中始终保持状态,就必须在每一个客户端可能请求的路径后面都包含这个session id。       另外一种技术叫作表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时可以把session id传递回服务器。好比下面的表单<form name="testform" action="/xxx"><input type="text"></form>       在被传递给客户端以前将被改写成<form name="testform" action="/xxx"><input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"><input type="text"></form>       这种技术如今已较少应用,笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。实际上这种技术能够简单的用对action应用URL重写来代替。       在谈论session机制的时候,经常听到这样一种误解“只要关闭浏览器,session就消失了”。其实能够想象一下会员卡的例子,除非顾客主动对店家提出销卡,不然店家绝对不会轻易删除顾客的资料。对session来讲也是同样的,除非程序通知服务器删除一个session,不然服务器会一直保留,程序通常都是在用户作log off的时候发个指令去删除session。然而浏览器历来不会主动在关闭以前通知服务器它将要关闭,所以服务器根本不会有机会知道浏览器已经关闭,之因此会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次链接服务器时也就没法找到原来的session。
       若是服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然可以找到原来的session。       偏偏是因为关闭浏览器不会致使session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就能够认为客户端已经中止了活动,才会把session删除以节省存储空间。

以上部分主要介绍了session的相关知识web

可是实际在android中
用的时候就是在httpclient中使用这个session来进行请求链接的
进一步说就是cookie  我看过cookie中方的就是session
拿到这个session就能够操做一些登录以后才能操做的内容了
相关文章
相关标签/搜索