httpSession的正确理解
关于HttpSession的误解实在是太多了,本来是一个很简单的问题,怎会搞的如此的复杂呢?下面说说我的理解吧:
一个session就是一系列某用户和服务器间的通讯。服务器有能力分辨出不同的用户。一个session的建立是从一个用户向服务器发第一个请求开始,而以用户显式结束或session超时为结束。
其工作原理是这样的:
1.当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号;
2.这个用户随后的所有请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪个session。
这种机制不使用IP作为标识,是因为很多机器是通过代理服务器方式上网,没法区分每一台机器。
对于session标识号(sessionID),有两种方式实现:cookies和URL重写。
HttpSession的使用
我们来看看在API中对session是如何定义和操作的。
当需要为用户端建立一个session时,servlet容器就创建了一个HttpSession对象。其中存储了和本session相关的信息。所以,在一个servlet中有多少个不同用户连接,就会有多少个HttpSession对象。
使用的机理是:
1.从请求中提取HttpSession对象;
2.增加或删除HttpSession中的属性;
3.根据需要关闭HttpSession或使其失效。
在请求中有两个重载的方法用来获取HttpSession对象。
HttpSession getSession(boolean create)/getSession();作用是提取HttpSession对象,如果没有自动创建。
获取到HttpSession对象后,我们就需要使用HttpSession的某些方法去设置和更改某些参数了。如:
void setAttribute(String name, Object value);
Object getAttribute(String name);
void removeAttribute(String name);
在javax.servlet.http包里一共定义了四个session监听器接口和与之关联的两个session事件。分别是:
HttpSessionAttributeListener and HttpSessionBindingEvent;
HttpSessionBindingListener and HttpSessionBindingEvent;
HttpSessionListener and HttpSessionEvent;
HttpSessionActivationListener and HttpSessionEvent.
他们的继承关系是:
所有四个接口的父类是java.util.EventListener;
HttpSessionEvent扩展java.util.EventObject;
而HttpSessionBindingEvent又扩展了HttpSessionEvent。
以下分别详述:
HttpSessionAttributeListener
当session中的属性被添加,更改,删除时得到通知。这个接口上节讲过,主要看其它三个。
HttpSessionBindingListener
当一个实现了HttpSessionBindingListener的类被加入到HttpSession中(或从中移出)时,会产生HttpBindingEvent事件,而这些事件会被它本身接收到。
本接口定义了两个方法:
void valueBound(HttpSessionBindingEvent e);
void valueUnbound(HttpSessionBindingEvent e);
当多个实现了HttpSessionBindingListener的类被加入到HttpSession中时,各类的方法只对本类感兴趣,不会去理会其它类的加入。
即使是同一类的不同实例间,也是互不关心的(各扫门前雪)。
我们可以看到前两个接口都对HttpSessionBindingEvent事件做出反应,但机理不同。
HttpSessionAttributeListener是在web.xml中登记的,servlet容器仅创建一个实例,来为任何在session中增加属性的servlet服务。触发事件的对象是所有可以转换为Object的实例。
HttpSessionBindingListener不用在web.xml中登记,在每个servlet中用new创建实例,且仅对本实例向session中的加入(或移出)感兴趣。触发事件的对象仅仅是自己。
HttpSessionListener
对于session的创建和取消感兴趣。需要在web.xml中登记。
共有两个方法:
void sessionCreated(HttpSessionEvent se);
void sessionDestroyed(HttpSessionEvent se);
使用它我们可以容易的创建一个类来对session计数。
也许我们会简单的考虑使用sessionDestroyed方法来在session结束后做一些清理工作。但是,请注意,当这个方法被调用的时候,session已经结束了,你不能从中提取到任何信息了。因此,我们要另辟蹊径。
一种通常采用的方法是使用HttpSessionBindingListener接口。在session创建时增加一个属性,而在session结束前最后一件事将这个属性删除,这样就会触发valueUnbound方法,所有对session的清理工作可以在这个方法中实现。
HttpSessionActivationListener
当session在分布式环境中跨JVM时,实现该接口的对象得到通知。共两个方法:
void sessionDidActivate(HttpSessionEvent se);
void sessionWillPassivate(HttpSessionEvent se);
1、HTTP协议本身是“连接-请求-应答-关闭连接”模式的,是一种无状态协议(HTTP只是一个传输协议);
2、Cookie规范是为了给HTTP增加状态跟踪用的(如果要精确把握,建议仔细阅读一下相关的RFC),但不是唯一的手段;
3、所谓Session,指的是客户端和服务端之间的一段交互过程的状态信息(数据);这个状态如何界定,生命期有多长,这是应用本身的事情;
4、由于B/S计算模型中计算是在服务器端完成的,客户端只有简单的显示逻辑,所以,Session数据对客户端应该是透明的不可理解的并且应该受控于服务端;Session数据要么保存到服务端(HttpSession),要么在客户端和服务端之间传递(Cookie或url rewritting或Hidden input);
5、由于HTTP本身的无状态性,服务端无法知道客户端相继发来的请求是来自一个客户的,所以,当使用服务端HttpSession存储会话数据的时候客户端的每个请求都应该包含一个session的标识(sid, jsessionid 等等)来告诉服务端;
6、会话数据保存在服务端(如HttpSession)的好处是减少了HTTP请求的长度,提高了网络传输效率;客户端session信息存储则相反;
7、客户端Session存储只有一个办法:cookie(url rewritting和hidden input因为无法做到持久化,不算,只能作为交换session id的方式,即a method of session tracking),而服务端做法大致也是一个道理:容器有个session管理器(如tomcat的org.apache.catalina.session包里面的类),提供session的生命周期和持久化管理并提供访问session数据的api;
8、使用服务端还是客户端session存储要看应用的实际情况的。一般来说不要求用户注册登录的公共服务系统(如google)采用cookie做客户端session存储(如google的用户偏好设置),而有用户管理的系统则使用服务端存储。原因很显然:无需用户登录的系统唯一能够标识用户的就是用户的电脑,换一台机器就不知道谁是谁了,服务端session存储根本不管用;而有用户管理的系统则可以通过用户id来管理用户个人数据,从而提供任意复杂的个性化服务;
9、客户端和服务端的session存储在性能、安全性、跨站能力、编程方便性等方面都有一定的区别,而且优劣并非绝对(譬如TheServerSide号称不使用HttpSession,所以性能好,这很显然:一个具有上亿的访问用户的系统,要在服务端数据库中检索出用户的偏好信息显然是低效的,Session管理器不管用什么数据结构和算法都要耗费大量内存和CPU时间;而用cookie,则根本不用检索和维护session数据,服务器可以做成无状态的,当然高效);
10、所谓的“会话cookie”简单的说就是没有明确指明有效期的cookie,仅在浏览器当前进程生命期内有效,可以被后继的Set-Cookie操作清除掉
分享到:
相关推荐
标题中的“httpSession”指的是HTTP...总的来说,httpSession是Web开发中不可或缺的一部分,理解其原理和正确使用方式对于构建健壮的、高可用的应用程序至关重要。通过学习和实践,我们可以更好地掌握这一核心技术。
总结来说,Spring 4中的WebSocket结合HttpSession,可以为实时通信场景提供用户上下文信息,确保数据的正确传递。通过配置WebSocket、创建WebSocket控制器、获取HttpSession以及客户端的订阅,我们可以实现WebSocket...
总而言之,正确理解HTTP会话管理是开发Web应用时的一项基本技能。它涉及到Session的创建、存储、检索和销毁,以及Cookie的生成、传输和存储。这些机制共同作用,使得无状态的HTTP协议能够在实际应用中支持连续的状态...
为了解决这个问题,Web开发者使用了会话跟踪技术,如Servlet中的HttpSession对象。 会话(session)是在用户与服务器交互的过程中,一系列连续的请求和...正确理解和使用会话跟踪技术是构建动态Web应用程序的基础。
### Session的使用详解 #### 一、Session概念与工作原理 **Session** 是一种服务器端技术,用于在用户的多个请求之间保持数据。...正确地理解和使用 HttpSession 对于构建稳定可靠的 Web 应用程序至关重要。
vletContextAttributeEventscar) 若有对象自Application的范围移除,通知正在收听的对象 voidattributeReplaced...正确理解和运用Servlet监听器,对于构建高性能、高可用的Web应用至关重要。
- `session`对象实现了`HttpSession`接口,选项A正确。 - `session`提供了服务器和客户端的会话管理,选项B正确。 - `session`可以存储用户特定的信息,选项C正确。 - `getAttribute()`方法用于获取session中的...
3. **消息路由**:Spring可以自动将消息路由到正确的目标,基于消息头中的信息,如`/topic`或`/user`前缀。 4. **广播消息**:通过`/topic`,服务器可以广播消息给所有订阅的客户端。对于个人用户的消息,可以使用`...
正确答案应当是“正确”,因为HTTP是Servlet标准通信协议,但根据题目的描述,正确答案被标记为“错误”,这可能是因为题干表述与实际Servlet规范相悖,或者是在测试应试者对规范的精确理解。 #### 题目6:Servlet...
创建HttpSession对象(A错误,应通过`request.getSession()`获取)。`getParameter`用于HTTP请求参数(B错误,应使用`getAttribute`)。`removeAttribute`和`setAttribute`是正确使用session的方法(CD正确)。 11...
为了确保正确地处理会话复制,开发者需要理解所使用容器的文档和配置选项。 总的来说,`HttpSession`接口是Java Web开发中管理会话状态的标准工具。正确使用它,结合适当的会话复制策略,可以构建出高效、可伸缩的...
总的来说,Session是Java Web开发中保持用户状态的关键工具,正确理解和使用Session能够帮助构建更高效、安全的Web应用。在设计Web应用时,需要注意合理设置Session超时时间,平衡用户体验和服务器资源的利用。
8. **关于HttpSession**:每个HttpSession对象确实有唯一的ID,这个ID是由Servlet容器自动分配的,应用开发者无需手动分配,所以`(B)`是正确的。而`(A)`不正确,因为不是每个HTTP请求都会创建新的HttpSession,只有...
8. 从session中获取对象应使用`getAttribute`方法,正确答案是E:`HttpSession.getAttribute()`。 9. 在禁用cookie的情况下,保持客户端状态的技术: - B. HTTP Session - 可以使用基于URL的Session ID传递。 - C...
正确的类和方法组合是`HttpSession`, `getSession()`,所以选项D是正确的答案。 3. **检索session属性**:从session中检索属性值使用`getAttribute()`方法,因此选项A `session.getAttribute("userid")`是正确的...
通常,需要创建一个MultipartFormDataContent对象,添加文件数据,并设置正确的Content-Type头。以下是一个C#客户端上传文件的示例: ```csharp using (var client = new HttpClient()) { var content = new ...
`HttpSession`接口可以用来存储用户会话信息,从而实现身份认证,因此正确答案是C.HttpSession。 18. **无需编写数据库连接代码的Bean** CMP(Container Managed Persistence)是由容器管理持久化,开发者无需...
- **选项c**: 当服务器显式地调用了 `HttpSession` 的 `invalidate()` 方法时,session 会立即结束,正确。 - **选项d**: 客户端连接到其他应用并不会自动导致当前应用的 session 结束,除非配置了特殊的机制,因此...