- 浏览: 76582 次
- 性别:
- 来自: z驻马店
文章分类
最新评论
原来我一直认为只有当创建session对象时才有session,其实不是。在第一次请求时就有了session,只是在jsp/servlet中
session的对象(记好是对象)在jsp中默认创建,而在servlet中需要显示的创建。
下面是网上看到的一些总结:
关于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已经结束了(session过时或者session.invalidate()后,session结束,这时就无法再获取到该session,使用的话会报错),你不能从中提取到任何信息了。因此,我们要另辟蹊径。
一种通常采用的方法是使用HttpSessionBindingListener接口。在session创建时增加一个属性,而在session结束前最后一件事将这个属性删除,这样就会触发valueUnbound方法,所有对session的清理工作可以在这个方法中实现。
valueUnbound的触发条件是以下三种情况:
a.执行session.invalidate()时。
b.session超时,自动销毁时。
c.执行session.setAttribute("onlineUserListener", "其他对象");或session.removeAttribute("onlineUserListener");将listener从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操作清除掉
发表评论
-
javascript encodURI() 和 JAVA URLDecoder.decode
2012-08-08 11:11 1445Js中 encodURI(encodURI(xxxx)),在j ... -
关于js中"window.location.href"、"location.href"
2012-04-12 17:08 835关于js中"window.location.href ... -
hibernate.current_session_context_class 错误
2011-12-27 15:24 890在使用SessionFactory的getCurrentSes ... -
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
2011-12-27 10:14 788Insert是T-sql中常用语句,Insert INTO t ... -
Java的SPI机制
2011-12-02 15:39 689SPI的全名为Service Provider Interfa ... -
关于TomCat自动加载class问题
2011-12-01 16:49 3281每次用tomcat的时候,每当我对类做了修改必须要重新启动to ... -
Eclipse无法自动编译的问题
2011-11-21 10:37 1128今天遇到了一个小问题,就是eclipse下导入的工程都无法 ... -
转:DynaBean 的使用
2011-11-08 11:21 3961DynaBean 的使用 在正常的开发的过程 ... -
jsp 自定义标签
2011-10-08 21:31 1017有时候web.xml中无法配置<taglib>,原 ... -
Dom4j使用
2011-09-29 19:37 1380先来一段网上的废话: om4j是一个Java的XML API ... -
java.lang.NoClassDefFoundError: org/jaxen/JaxenException
2011-09-29 16:47 1081Exception in thread "mai ... -
commons logging log4js的使用
2011-09-28 17:14 1067为什么要用日志(Log ... -
javascript void(0)的含义
2011-09-28 08:55 937我想使用过ajax的都常见这样的代码:<a href ... -
struts1 验证框架
2011-09-25 11:53 11801:建立validator-rules.xml和 valida ... -
struts1 DispatchAcion
2011-09-24 18:40 857public class LoginAction extend ... -
Exploded location overlaps an existing deployment” 的解决方法
2011-09-24 17:10 975项目->properties->MyEclipse ... -
java程序员面试交流项目经验
2011-09-02 20:23 9611:请你介绍一下你自己 ... -
Java项目开发规范之方法命名规范
2011-09-02 20:19 10401 共用类公共用类要求以“功能英文名称(首字母大写)”+ Ut ... -
伪代码
2011-08-14 19:33 934所谓伪代码其实就是配合初学编程的,常用代码配合写算法,也就是把 ...
相关推荐
### HttpSessionListener 和 HttpSessionBindingListener 的区别 #### 一、概述 在Java Web开发中,`HttpSessionListener`和`HttpSessionBindingListener`都是用于监听HTTP会话生命周期的重要接口。它们分别用于...
`HttpSessionBindingListener`是`HttpSession`的一个监听器接口,它包含两个方法:`valueBound`和`valueUnbound`。当对象被绑定到`HttpSession`(例如,用`session.setAttribute()`添加对象)时,`valueBound`方法会...
用于监听HttpSession的创建和销毁事件,监听器类需实现javax.servlet.http.HttpSessionListener接口。 HttpSessionListener接口的方法: voidsessionCreated(HttpSessionEventhsce) 通知正在接收的对象,新的...
HttpSession HttpSessionActivationListener HttpSessionAttributeListener HttpSessionBindingEvent HttpSessionBindingListener HttpSessionContext HttpSessionEvent HttpSessionListener HttpUtils ...
* HttpSessionListener:用于监听HttpSession的创建和销毁事件 这些接口都有两个方法:一个是销毁触发方法,一个是创建触发方法。例如,ServletContextListener有contextDestroyed方法和contextInitialized方法。 ...
HttpSession session = request.getSession(); session.setAttribute("loggedInUser", user); ``` 同时,在用户登出或会话过期时,会触发`valueUnbound()`方法。 通过这个“servlet 监听器范例”,我们不仅学习了...
HttpSessionListener - **方法**: - `sessionCreated(HttpSessionEvent hse)`:当一个新的HttpSession被创建时调用。 - `sessionDestroyed(HttpSessionEvent hse)`:当一个HttpSession被销毁时调用。 - **事件**...
- `javax.servlet.http.HttpSessionBindingListener` - `javax.servlet.http.HttpSessionActivationListener` - `javax.servlet.http.HttpSessionAttributeListener` ##### 3. `ServletRequest`监听器 - **事件...
- `HttpSessionBindingListener`接口:这个接口不是直接的监听器,而是由HttpSession中的对象实现,当这个对象被绑定或解绑到HttpSession时,监听器方法会被调用。`valueBound`和`valueUnbound`方法分别在对象绑定...
2. **HttpSessionBindingListener**:监听任何绑定到或从HttpSession中解绑的对象。 3. **HttpSessionActivationListener**:监听HttpSession的激活和钝化事件,适用于分布式环境。 4. **HttpSessionListener**:...
- **第三类**:HttpSessionBindingListener和HttpSessionActivationListener,用于监听HttpSession中的JavaBean状态变化,如钝化、活化、绑定和解除绑定。 【监听器使用示例】 - **ServletContextListener**:在...
javax.servlet.http.HttpSession javax.servlet.RequestDispatcher javax.servlet.SingleThreadModel javax.servlet.ServletInputStream javax.servlet.ServletContextEvent javax.servlet.ServletOutputStream ...
2. HttpSessionListener:监听HttpSession域对象的创建、销毁。例如,在服务器第一次调用getSession方法时,该监听器方法被执行public void sessionCreated(HttpSessionEvent httpSessionEvent);在session过期/调用...
- **HttpSessionBindingListener** 和 **HttpSessionActivationListener**: - 这两个监听器主要用于实现对象的序列化和反序列化。 - 实现了这些监听器的对象,在放入或从`HttpSession`中移除时,将自动触发序列化...
在Java Servlet API中,提供了多种监听器接口,例如HttpSessionListener、HttpSessionAttributeListener和HttpSessionBindingListener,用于监听会话的创建、销毁、属性添加、修改和移除等事件。 在这个特定的例子...
- **HttpSessionBindingListener** 和 **HttpSessionActivationListener**:这两个接口关注HttpSession中对象的绑定和激活事件,常用于会话持久化和集群环境下的会话管理。 4. **使用监听器的好处** - **解耦合**...
在Java Web中,我们可以使用HttpSessionListener或者HttpSessionAttributeListener接口来实现这一目标。这里我们将主要关注HttpSessionBindingListener,因为它可以监听到Session中的属性变化。 1. 创建一个实现了...
- 监听session的创建、销毁、属性增减变化和绑定事件:通过实现HttpSessionListener、HttpSessionActivationListener、HttpSessionAttributeListener和HttpSessionBindingListener接口,可以监听和响应会话相关的...