一,会话跟踪(session tracking)技术
会话是客户端发送请求,服务器返回响应的连接时间段。
HTTP是无状态协议:每次都是单独连接,不能维持客户的上下文信息。
会话跟踪技术是用于维持客户端和服务器端通信信息的技术。
三种典型客户端会话跟踪解决方案:
1,Cookie;
2,URL重写;
3,隐藏表单域;
二,会话Cookie
用于会话跟踪的Cookie叫做会话Cookie。Servlet规范中会话跟踪的cookie名字必须是JSESSIONID,保存在浏览器的内存中。区别于保存在外部存储设备的cookie。
对于存储在内存中的cookie,是不能被不同的浏览器进程共享,共享只能发生在同一个浏览器进程的不同窗口(对个窗口共享一个进程)中。对于存储在外部设备的cookie,可以多浏览器共享。
三,url重写
在浏览器不支持或禁用cookie的情况下,使用url重写代替cookie来跟踪用户会话。
每个页面都必须使用servlet或jsp动态生成(动态页面)。因为附加在URL上的sessionID是动态产生,所以对于静态页面的跳转,URL重写机制无能为力。
即使使用动态页面,如果用户离开了会话并且通过书签或链接再次回来,会话信息也会丢失,因为存储下来的链接含有错误的标识信息。
必须将所有发送到客户端的url进行编码,调用HttpServletResponse接口中的encodeURL()方法和encodeRedirectURL()方法来实现。在调用sendRedirect()方法之前使用encodeRedirectURL()方法.
四,隐藏表单域
只能用于特定操作中。仅当每个页面都由表单提交而动态生成的时候,才可以使用隐藏表单域,用来存储相关会话信息。
五,servlet中的会话跟踪
javax.servlet.http.HttpSession接口是servlet提供会话跟踪解决方案。
HttpSession对象存放在服务器端,只是对cookie和url重写技术的封装应用,所以要求服务器支持cookie,可以全局切换到url重写。
1,访问与当前请求相关联的会话对象:getSession(boolean value)方法
在会话过程中,web容器负责为客户端维护一个唯一的HttpSession对象。
对于新会话,web容器创建使用实现了HttpSession接口的HttpSession对象封装当前请求会话的信息(散列表的方式存储)。
使用HttpServletRequest的getSession()方法访问HttpSession对象。
在后台,系统从cookie或URL重写附加的数据中提取出用户ID。以ID为key,遍历之前创建的HttpSession对象内建的散列表。
如果找不到匹配的会话ID,系统重新创建一个新的会话。默认情况下(不禁用Cookie)还会创建一个名为JSESSIONID,值为唯一标识用户表示会话ID的输出cookie。
因为调用getSession()方法会影响到后面的响应,所以只能在发送任何文档内容到客户端之前调用getSession()方法。
区别:getSession(boolean value)方法:如果系统没有找到与请求关联的会话ID,true表示返回新会话。false表示方法返回null。
2,访问和设置与会话相关联信息,维护会话的状态:HttpSession的getAttribute()方法和setAttribute()方法
散列表:HttpSession对象内建数据结构,用于存储 当前请求会话的数据(会话的属性)。可以存储任意数量的key-value对。
使用HttpSession的getAttribute()方法和setAttribute(String key,Object value)方法读取和设置当前请求会话数据(即对散列表的操作),维护会话的状态。
setAttribute方法会替换任何之前的属性。如果不想被替换,则需要在设置之前使用removeArrtibute(String key)方法移除该属性。
setAttribute方法会触发所有实现了HttpSessionBindingListener接口的valueBound方法,做一些初始化状态的操作。
removeArrtibute方法会触发所有实现了HttpSessionBindingListener接口的valueUnbound方法,做一些消除状态的操作。
对于分布式WEB应用程序,将web应用程序标记为可分布式执行,系统需要能够将会话对象在机器之间传递,这时需要将会话的属性实现Serializable接口。
3,废弃会话数据
只移除自己编写的的servlet创建的数据:removeArrtibute(String key)方法
(web应用程序中删除)删除整个会话:invalidate()方法,可以用该方法注销用户。
(Web服务器中删除)将用户从系统中注销并且删除所有与该会话关联的会话:logout()方法。一定要与其他web应用程序协调loggout命令的使用。
4,会话超时时间间隔
getMaxInactiveInterval()方法和setMaxInactiveInterval()方法读取和设置在没有访问的情况下,会话保存的最长时间。秒为单位。负数表示会话从不超时。超时由服务器来维护。
5,会话最后次被客户端访问的时间:getLastAccessedTime()方法
可以用来确定客户端在二次请求之间会话的非活动时间。
6,获取会话被创建的时间:getCreationTime()方法 返回long类型数据
7,返回分配给session的唯一标识ID,为字符串。getId()方法
六,浏览器会话与服务器会话
浏览器会话
默认情况下,会话跟踪基于存储在浏览器内存中的cookie,区别于存储在外围存储设备上的cookie。
需要servlet显示的读取JSESSION cookie,设置最大时效和路径并添加到客户端,否则退出浏览器就会中断会话。
服务器会话
服务器需要将会话保存在内存中,在会话处于非活动状态超过设定的间隔(会话超时)就移除会话。
七,对绑定到session中的对象(属性)初始化和消除状态。HttpSessionBindingListener监听器接口和HttpSessionBindingEvent事件类。
Servlet容器通过实现HttpSessionBindingListener监听器接口的监听器来监听HttpSessionBindingEvent事件。
HttpSessionBindingListener监听器接口方法:
1,valueBound(HttpSessionBindingEvent event):对象被绑定到session中时该方法通知对象。做初始化操作。
2,valueUnbound(HttpSessionBindingEvent event): 对象被移除出session时该方法通知对象。做消除状态操作。
HttpSessionBindingEvent事件方法:
1,getName():获取触发事件的属性的名字。
2,getValue():获取触发事件的属性的值。
3,getSession():返回Session对象。
八,在 Java Servlet API中有关的监听器接口。
与Session相关的监听器接口
javax.servlet.http.HttpSessionActivationListener:如果绑定到Session中,当Session被钝化或激活时,Servlet容器将通知该对象。
javax.servlet.http.HttpSessionAttributeListener:如果想要在Session中的属性列表发生改变时得到通知,可以实现这个接口。
javax.servlet.http.HttpSessionListener:如果需要在Session创建后或者Session无效前得到通知,可以实现这个接口,实现该接口的类必须在web应用程序的部署描述符中进行配置。
与Servlet上下文有关的监听器接口:
javax.servlet.ServletContextAttributeListener:在Servlet上下文中的属性列表发生改变时得到通知,可以实现这个接口,实现该接口的类必须在web应用程序的部署描述符中进行配置。
javax.servlet.ServletContextListener:如果需要在Servlet上下文对象初始化时或被销毁的时候得到通知,可以实现这个接口,实现该接口的类必须在web应用程序的部署描述符中进行配置。
与请求相关的监听器接口:servlet2.4规范定义
javax.servlet.ServletRequestAttributeListener:Servlet请求对象中的属性发生改变时得到通知。
javax.servlet.ServletRequestListener:请求对象初始化或者被销毁时得到通知。
分享到:
相关推荐
传统的会话跟踪技术主要包括Cookie、URL重写和隐藏表单字段。 Cookie技术是最常见的会话跟踪手段。它由Web服务器在用户首次访问时发送到用户的浏览器,通常包含一个或多个键值对,存储用户的相关信息,如购物车内容...
每种技术都有其优缺点,比如隐藏表单域和URL重写可能会暴露敏感信息,而Cookie可能被禁用或者被客户端篡改。 总之,基于Servlet的会话跟踪是通过HttpSession对象实现的,它使得服务器能够在无状态的HTTP协议之上...
2. **URL重写**:若Cookie不可用或受限,服务器可以在URL中附加会话ID,用户每次访问新的页面时,会话ID通过URL传递回服务器。 3. **隐藏表单字段**:类似于URL重写,但通过在HTML表单中添加一个隐藏的输入字段来...
除了Cookie和Session,还有其他一些会话跟踪技术。例如,URL重写,即在URL后面附加Session ID,以保持会话状态。这种方法适用于Cookie被禁用的情况,但会使URL变得冗长,不便于用户书签和分享。另外,隐藏表单字段也...
同时,还可以学习如何结合其他会话跟踪方法,如Cookie和URL重写,来增强应用的功能和用户体验。 在Java JSP中,会话跟踪经常与EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)结合使用...
**Servlet的会话跟踪技术详解** ...在Servlet应用中,会话跟踪是实现用户...通过理解并熟练运用Cookie、URL重写和隐藏表单字段等方法,以及Servlet API,开发者可以有效地管理用户会话,提高Web应用的功能性和用户体验。
5. **会话跟踪**:除了使用cookie,还可以通过URL重写方式跟踪会话,即在URL后面附加会话ID。这种方法适用于禁用cookie的浏览器。 6. **会话范围内的通信**:在大型应用中,有时需要在多个请求间共享数据,但又不...
本资源"第五章 会话跟踪"可能包含了使用这些技术的实际示例,如创建和管理HttpSession,处理Cookie,以及在Struts或Spring框架中如何集成会话跟踪。学习这些内容可以帮助开发者在实际项目中更有效地处理用户会话,...
会话跟踪技术在Java Web开发中尤为重要,通常涉及到的技术包括Cookie和HttpSession。 #### 二、使用Cookie进行会话跟踪 ##### 2.1 Cookie简介 Cookie是一种简单的跟踪机制,它通过在客户端浏览器中存储小块数据来...
会话的工作原理是,服务器为每个客户端分配一个唯一的会话ID,并将其通过Cookie或URL重写等方式返回给客户端。然后,客户端在后续的每次请求中都携带这个会话ID,使得服务器能够识别并恢复之前保存的客户端状态。 *...
会话跟踪 4.1 会话管理 4.2 通过Cookie支持会话 4.3 URL重写与隐藏表单域 4.1.1 理解状态与会话 4.1.2 会话管理机制 4.1.3 HttpSession接口 4.1.4 使用HttpSession对象 4.1.5 会话超时与结束
- **多种跟踪方式结合**:结合Cookie和URL重写等方法,提高会话跟踪的可靠性。 - **会话复制**:在集群环境中,可以采用会话复制的方式,将同一个会话的信息同步到集群中的所有服务器上。 - **定期清理无效会话**:...
### 会话跟踪技术详解 ...本文详细介绍了使用Cookie、URL重写和隐藏表单域三种常见的会话跟踪方法,并重点讨论了Java中实现会话跟踪的具体实现方式。开发者可以根据应用场景选择最适合的会话跟踪方案。
2. **URL重写**: 如果担心cookie被禁用或不安全,可以将会话ID附加到URL中。但这可能导致链接的可见性增加,对SEO不友好。 3. **隐藏表单字段**: 在HTML表单中添加一个隐藏字段来传递会话ID,适用于表单提交场景。 ...
为了克服这个问题,开发者采取了几种会话跟踪技术,包括URL重写、隐藏域、Cookies以及HttpSession。下面我们将详细探讨这些技术。 首先,URL重写是一种简单但有限制的方法。它通过在URL中添加key-value对来存储信息...
实验内容与步骤详细指导了如何运用`HttpSession`和Cookie来实现会话跟踪。通过实际操作,学生不仅可以理解这些技术的工作原理,还能锻炼编程技能,加深对Java Web开发的理解。在实际项目中,开发者通常会根据需求和...
7. **会话级cookie vs URL重写**:在没有Cookie支持或考虑到安全性的情况下,服务器可以使用URL重写来跟踪会话。通过在URL后面附加会话ID,服务器可以在不依赖Cookie的情况下识别会话。 8. **会话劫持与固定会话ID*...
总之,JSP会话追踪是实现Web应用状态管理的核心技术,它通过HttpSession接口提供了一种便捷的方式来跟踪和存储用户状态,从而提升用户体验。正确理解和使用会话追踪能有效优化Web应用的功能和性能。
### JSP中的会话状态管理 #### 一、引言 在JSP (JavaServer Pages) ...通过合理地使用Cookies、URL重写和隐藏表单字段等方法,开发人员可以有效地管理和维护用户的会话状态,从而构建出更加稳定可靠的Web应用程序。
这个过程涉及到的技术包括:会话管理、Cookie的使用、SQL Server数据库操作、***和ASP页面生命周期的理解以及网络编程。在开发过程中,开发者需要密切注意数据类型的一致性,以及确保安全地存储和传输会话数据,避免...