在服务器端,我们用惯了session.setAttribute("",userInfo)这样的一行代码,估计你很少想到:服务器与浏览器之间是如何保持会话状态的。好了,先引用一些文章的精彩片段:
http://www.xxx.com/xxx_app;jsessionid=xxxxxxxxxx?a=x&b=x。
这跟一般的url基本一样,只有一个地方有区别,那就是“;jessionid=xxxxxxxx”。这个参数有时候有,有时候又没有,说它是参数可又跟一般传递的参数不同,它是紧跟在url后面用分号来分隔的 ,用一般的request.getParameter()方法还取不到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-Encoding
|
gzip,deflate
|
Accept-Charset
|
GB2312,utf-8;q=0.7,*;q=0.7
|
Keep-Alive
|
115
|
Connection
|
keep-alive <!--[if !supportLineBreakNewLine]--> <!--[endif]-->
|
服务器响应头信息
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:" + request.getSession().getId());
你会看到,当你第一次请求服务器时,就会默认有一个新的session被创建,而且在session的有效时间范围内,这个输出值是不会变的,否则,服务器会重新创建一个session,自然,sessionId也就不同了,这段代码的输出自然也会不同了。
(4)你必须注意这一点:你用的是浏览器与服务器通信:
有一些事情是浏览器帮助我们去做了,那就是:当你第一次与服务器通信时,浏览器会保存服务器返回的 Set-Cookie 这个健的值( JSESSIONID=64D21B4D69DFB3041B6375C1932BD6CB ),只要你不关闭浏览器(彻底关闭,关闭选项卡不算),浏览器会从第二次向服务器发出请求开始,一直带上这个键值对,发给服务器。服务器就会知道,这是同一个人(同一个会话)发起的请求。
(5)我们再注意一下:request.setAttribute("sysuser",userInfo)这句话:
当你第一次请求服务器时,这句代码会根据服务器默认产生的session得到ID,并与sysuser=userInfo这个键值对挂上钩(当然,userInfo可以是任何对象),保证唯一关联,检测用户是否登录就是这样实现的。
我一定要声明一点:保持一个会话与用户是否登录是没有任何关系的。
转自:http://www.g4studio.org/forum.php?mod=viewthread&tid=275
分享到:
相关推荐
在Tomcat服务器中,默认情况下,用于传递会话标识(即JSessionID)的Cookie名称为“JSESSIONID”。有时,出于安全考虑或其他需求,我们可能需要自定义这个名称。本文将详细介绍如何在不同版本的Tomcat中更改...
在Web开发中,会话是一种在用户浏览器与服务器之间维持状态的技术,允许跨多个HTTP请求共享数据。传统的会话管理通常在服务器端进行,通过Session ID存储在服务器的内存中,但这种做法在分布式环境下难以应对,因为...
本文将详细讲解如何在Android客户端获取`jsessionId`以及如何在后续请求中发送`jsessionId`,以保持会话的有效性。 一、jsessionId简介 `jsessionId`是Java Servlet容器(如Tomcat)在服务器端生成的一个唯一标识,...
8. **联系**:Cookie常用来保存会话ID,实现用户登录状态的保持。用户首次登录后,服务器将sessionID通过Cookie返回给客户端,之后客户端通过Cookie中的sessionID来维持会话。 这两个概念在实际开发中经常结合使用...
- **持久性**:Session具有一定的持久性,可以在一定时间内保持用户的会话状态。 - **安全性**:由于数据不在客户端存储,相对更安全。 ##### 3.2 使用Session **创建Session**: ```java HttpSession session = ...
它通常被附加到URL后面,以便在页面重定向或刷新时保持会话状态。然而,这种方式存在一些问题: 1. **安全性**:`jsessionid`暴露在URL中可能带来安全风险,如会话劫持或跨站脚本攻击(XSS)。攻击者可以通过获取...
当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该信息,所以不会被窃取到Cookie 的具体内容。...
response.setHeader("Set-Cookie", "JSESSIONID=" + sessionID + "; Path=/yourPath; Secure; HttpOnly"); ``` - **问题2**: 修改程序中不兼容的代码 - **现象1**: 设置`HttpOnly`属性后,程序无法获取客户端...
总结而言,在 Android 开发中,合理管理 Cookie 对于保持客户端与服务器之间的一致性非常重要。通过上述方法,我们可以有效地控制 Cookie 的设置和获取,从而实现更加稳定的会话管理。同时,利用 WebView 的 Cookie ...
**Session** 和 **Cookie** 是Web开发中用于保持客户端与服务器之间会话状态的重要技术。由于HTTP协议本身是无状态的,即服务器无法自动记录客户端的状态信息,因此需要通过Session和Cookie等技术手段来实现对用户...
在Servlet应用中,会话跟踪是实现用户会话持久化的重要手段,使得客户端与服务器之间能够保持连续的状态,即使在多个请求之间也能识别同一个用户。本篇将深入探讨基于Servlet的会话跟踪技术。 **1. 会话的概念** ...
1. **依赖关系**:Session通常依赖于Cookie中的jsessionid来标识用户。当服务器找不到客户端的jsessionid或者对应的Session过期或已被销毁,服务器会创建新的Session对象。 2. **创建时机**: - 第一次请求时,...
为了保持用户状态,服务器需要一种机制来识别不同的会话,这就是Session技术。 Cookie是由服务器创建并发送到客户端(浏览器)的一小段信息,它存储在用户的本地设备上。每次用户发起请求时,浏览器都会自动将对应...
HTTP协议的每个请求都是独立的,无法在请求之间保持状态,而会话技术通过在服务器端存储用户相关信息,实现了跨请求的数据共享。以下将详细介绍实验中可能涉及的关键知识点: 1. **会话创建**:在JavaWeb中,通常...
Cookie是一种在客户端和服务器之间传递信息的方式,常用于维持会话状态。在.NET Web服务中,响应可能包含一个或多个Set-Cookie头部,Java客户端需要正确处理这些头部以保持会话。 在Java中,`HttpURLConnection`或`...
- JSessionID格式分析:JSessionID默认为会话标识符,可在weblogic.xml中自定义。其格式为`SessionId!PrimaryServerJVMHash!SecondaryServerJVMHash`,用于唯一识别每个会话及其对应的服务器实例。 #### 总结 面对...
3. **保持状态**:当用户刷新页面或访问其他受保护的页面时,浏览器会自动将`JSESSIONID`cookie附带在HTTP请求头中发送给服务器。服务器接收到请求后,通过session ID查找对应的session数据,确认用户已登录状态。 ...
- 这个Token会被设置为一个Cookie发送到客户端,比如名为`JSESSIONID`的默认会话Cookie。 - 客户端在后续请求中自动附带这个Cookie。 - 服务器接收请求时,读取Cookie并解码Token,检查其有效性来确定用户身份。 ...
在Java Web开发中,Cookie和Session是两种非常重要的会话管理技术,它们用于跟踪和维护用户的状态信息。本文将深入探讨这两个概念,以及如何在实际应用中有效地利用它们。 首先,我们来理解Cookie。Cookie是一种在...
总之,解决Android与Web服务器之间的session保持问题,关键是理解Cookie和Session的工作原理,以及在Android中如何正确处理它们。通过手动设置请求头中的Cookie,或者使用支持自动处理Cookie的库,可以有效地实现...