javajsessionid会话_jsessionid对JAVAWEBjsessionid的剖析

javajsessionid会话_jsessionid对JAVAWEBjsessionid的剖析这跟⼀般的url基本⼀样,只有⼀个地⽅有区别,那就是“;jessionid=xxxxxxxx”。这个参数有时候有,有时候⼜没有,说它是参数可⼜跟⼀般传递的参数不同,它是紧跟在url后⾯⽤分号来分隔的 ,⽤⼀般的Parameter()⽅法还取不到jsessionid 。
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的作⽤
启动你的tomcat,打开FireFox(爱得不得了,⼀定要安装FireBug),输⼊localhost就⾏,打开firebug,点⽹络,你会看到,浏览器与服务器会话的信息,给出浏览器
(1)第⼀次请求服务器:
浏览器的请求头信息
Host
localhost
User-Agent
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language
zh-cn,zh;q=0.5
Accept-Encodingacceptlanguage
gzip,deflate
Accept-Charset
GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive
115
Connection
keep-alive
服务器响应头信息
Server
Apache-Coyote/1.1
Set-Cookie
JSESSIONID=64D21B4D69DFB3041B6375C1932BD6CB; Path=/
Content-Type
text/html;charset=UTF-8
Content-Language
zh-CN
Content-Length
242
Date
Mon, 28 Jun 2010 02:35:29 GMT
(2)第⼆次请求服务器:
浏览器的请求头信息
Host
localhost
User-Agent
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 Accept
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language
zh-cn,zh;q=0.5
Accept-Encoding
gzip,deflate
Accept-Charset
GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive
115
Connection
keep-alive
Cookie
JSESSIONID=64D21B4D69DFB3041B6375C1932BD6CB
服务器响应头信息
Server
Apache-Coyote/1.1
Content-Type
text/html;charset=UTF-8
Content-Language
zh-CN
Content-Length
242
Date
Mon, 28 Jun 2010 02:37:51 GMT
重复第三次,每四次...第N次请求服务器,浏览器和服务器的请求头信息都是与第⼆次请求服务器是⼀样的。
(3)但是,如果你在服务器端加⼊如下⼀⾏代码:
Log.info("SessionId:" + Session().getId());
你会看到,当你第⼀次请求服务器时,就会默认有⼀个新的session被创建,⽽且在session的有效时间范围内,这个输出值是不会变的,
否则,服务器会重新创建⼀个session,⾃然,sessionId也就不同了,这段代码的输出⾃然也会不同了。
(4)你必须注意这⼀点:你⽤的是浏览器与服务器通信:
有⼀些事情是浏览器帮助我们去做了,那就是:当你第⼀次与服务器通信时,浏览器会保存服务器返回的Set-Cookie这个健的值(JSESSIONID=64D21B4D69DFB3041B6375C1932BD6CB),只要你不关闭浏览器(彻底关闭,关闭选项卡不算),浏览器会从第⼆
次向服务器发出请求开始,⼀直带上这个键值对,发给服务器。服务器就会知道,这是同⼀个⼈(同⼀个会话)发起的请求。
(5)我们再注意⼀下:request.setAttribute("sysuser",userInfo)这句话:
当你第⼀次请求服务器时,这句代码会根据服务器默认产⽣的session得到ID,并与sysuser=userInfo这个键值对挂上钩(当然,userInfo
可以是任何对象),保证唯⼀关联,检测⽤户是否登录就是这样实现的。
我⼀定要声明⼀点:保持⼀个会话与⽤户是否登录是没有任何关系的。
(6)再次引深⼀下,如果你⽤的不是浏览器,⽐如说做J2ME开发,怎样保持会话呢?
(1)在你写完这⾏代码后:HttpConnection hc = (HttpConnection)Connector.open(httpURL),加⼊以下代码:(Constant.sessionID 只是⼀个静态变量)
·········10········20········30········40········50········60·····
//在与服务器通信前设置sessionId,维持唯⼀的⼀个会话
if(Constant.sessionID !=null) {
hc.setRequestProperty("Cookie", AppContext.CurrentAppContext.sessionID);
}
//在与服务器通信前设置sessionId,维持唯⼀的⼀个会话
if (Constant.sessionID != null) {  hc.setRequestProperty("Cookie", AppContext.CurrentAppContext.sessionID);}
(2) A:只向服务器读数据,不向服务写数据,B:先向服务器写数据,再从服务器读数据
对于这两种情况,只要你第⼀次打开openDataInputStream(),这可以加⼊以下代码(Constant.isLogin只是⼀个静态变量boolean):
·········10········20········30········40········50········60·····
//每次与服务器通信后,保存 sessionId
String cookie = hc.getHeaderField("Set-Cookie");
if(cookie !=null) {
String jsessionId = cookie.substring(0,cookie.indexOf(";"));
if(Constant.sessionID !=null&& !Constant.sessionID.equals(jsessionId) && Constant.isLogin ){
Log.info("sessionid超时, will get new sessionid, but you must login again");
//设置为未登录状态
Constant.isLogin =false;
}
Constant.sessionID = jsessionId;
}
//每次与服务器通信后,保存 sessionIdString cookie = hc.getHeaderField("Set-
Cookie");if (cookie != null) {      String jsessionId = cookie.substring(0,cookie.indexOf(";"));      if(Constant.sessionID != null && !Cons {          Log.info("sessionid超时, will get new sessionid, but you must login again");          //设置为未登录状
态          Constant.isLogin = false;      }      Constant.sessionID = jsessionId;}
这样就可以保持⼀个会话了。
(7)最后,关于URL重定向
引⽤⼀段话:sun帮我们想到了,所以提供了2个⽅法来使事情变得简单:deURL()和re
这2个⽅法会判断cookie是否可⽤,如果禁⽤了会解析出url中的jsessionid,并连接到指定的url后⾯,如果没有到jessionid会⾃动帮我
们⽣成⼀个。⾄于为什么要有2个⽅法?这2个⽅法有什么不同?google了⼀下,说是这2个⽅法在判断是否要包含jsessionid的逻辑上会稍
有不同。在调⽤
HttpServletResponse.sendRedirect前,应该先调⽤encodeRedirectURL()⽅法,否则可能会丢失 Sesssion信息。这2个⽅法的使⽤⽅
法如:response.deURL("/myapp /input.jsp"));。如果cookie没有禁⽤,我们在浏览器地址栏中看到的
地址是这样的:/myapp/input.jsp,如果禁⽤了 cookie,我们会看到:/myapp
/input.jsp;jsessionid=73E6B2470C91A433A6698C7681FD44F4。所以,我们在写web应⽤的时候,为了保险起见,应该在程序
⾥的每⼀个跳转url上都使⽤这2个⽅法,来保证session的可⽤性。

本文发布于:2024-09-22 04:12:42,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/370765.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:服务器   浏览器   请求
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议