session的机制
http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,那么要怎么才能实现会话跟踪呢?session就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出返回给客户端Cookie保存。
保存session id的几种方式
A.保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
B.由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
C.另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。
方法介绍
public void setAttribute(String name,Object value)
将value对象以name名称绑定到会话
public object getAttribute(String name)
取得name的属性值,如果属性不存在则返回null
public void removeAttribute(String name)
从会话中删除name属性,如果不存在不会执行,也不会抛处错误.
public Enumeration getAttributeNames()
返回和会话有关的枚举值
public void invalidate()
使会话失效,同时删除属性对象
public Boolean isNew()
用于检测当前客户是否为新的会话
public long getCreationTime()
返回会话创建时间
public long getLastAccessedTime()
返回在会话时间内web容器接收到客户最后发出的请求的时间
public int getMaxInactiveInterval()
返回在会话期间内客户请求的最长时间为秒
public void setMaxInactiveInterval(int seconds)
允许客户客户请求的最长时间
ServletContext getServletContext()
返回当前会话的上下文环境,ServletContext对象可以使Servlet与web容器进行通信
public String getId()
返回会话期间的识别号
常见问题
1、session在何时被创建
一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <%@page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历。 由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。
2、session何时被删除
综合前面的讨论,session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止(非持久session)
3、如何做到在浏览器关闭时删除session
严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。
4、有个HttpSessionListener是怎么回事
你可以创建这样的listener去监控session的创建和销毁事件,使得在发生这样的事件时你可以做一些相应的工作。注意是session的创建和销毁动作触发listener,而不是相反。类似的与HttpSession有关的listener还有 HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。
5、存放在session中的对象必须是可序列化的吗
不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在 Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。我所用过的某个iPlanet版本如果session中有不可序列化的对象,在session销毁时会有一个Exception,很奇怪。
6、如何才能正确的应付客户端禁止cookie的可能性
对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL
7、开两个浏览器窗口访问应用程序会使用同一个session还是不同的session
参见第三小节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。
8、如何防止用户打开两个浏览器窗口操作导致的session混乱
这个问题与防止表单多次提交是类似的,可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端,同时保存在session里,客户端提交表单时必须把这个id也返回服务器,程序首先比较返回的id与保存在session里的值是否一致,如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascript window.open打开的窗口,一般不设置这个id,或者使用单独的id,以防主窗口无法操作,建议不要再window.open打开的窗口里做修改操作,这样就可以不用设置。
9、为什么在Weblogic Server中改变session的值后要重新调用一次session.setValue
做这个动作主要是为了在集群环境中提示Weblogic Server session中的值发生了改变,需要向其他服务器进程复制新的session值。
10、为什么session不见了
排除session正常失效的因素之外,服务器本身的可能性应该是微乎其微的,虽然笔者在iPlanet6SP1加若干补丁的Solaris版本上倒也遇到过;浏览器插件的可能性次之,笔者也遇到过3721插件造成的问题;理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题。出现这一问题的大部分原因都是程序的错误,最常见的就是在一个应用程序中去访问另外一个应用程序。
分享到:
相关推荐
在本文中,我们将深入探讨如何使用Java编程语言和HttpSession接口来实现一个简单的验证码登录系统。验证码(CAPTCHA)是一种防止恶意机器人或自动化程序非法访问网站的安全机制,它要求用户输入图片上显示的一组随机...
在本文中,我们将探讨如何使用 HttpSession 实现 Ajax 请求重定向。 Ajax 请求是一种常用的技术,用于从服务器请求数据并更新页面内容。但是,在某些情况下,我们需要在 Ajax 请求成功后重定向到新的页面,以便显示...
本文将详细探讨两种主要的方法——利用`HttpSession`和`@PathParam`来区分不同的WebSocket客户端。 #### 二、使用`HttpSession`识别不同客户端 ##### 1. 理论基础 `HttpSession`是Java Servlet API中提供的一种...
这里我们将深入探讨这些技术,并结合一个名为"web26_session5示例1"的压缩包文件,来解析它们在实际应用中的综合运用。 首先,`HttpSession`是Java Servlet API的一部分,它提供了在HTTP会话之间存储和检索对象的...
下面我们将深入探讨ServletHttpSession的相关知识点。 **1. HTTP协议的无状态性** HTTP协议本身是无状态的,这意味着每次客户端向服务器发送请求,服务器处理完后就不再保留任何关于这个请求的信息。为了在多个请求...
下面我们将深入探讨相关知识点。 1. **HttpURLConnection**: HttpURLConnection是Java提供的一个类,用于通过HTTP协议进行网络通信。相比于Apache HttpClient库,HttpURLConnection更轻量级,更符合现代网络通信...
在这个"Servlet实现猜数字大小游戏"项目中,我们将探讨如何使用Servlet和session技术来创建一个互动的在线猜数字游戏。 首先,让我们理解Servlet的基本概念。Servlet是Java提供的一种服务器端的编程接口,它允许...
本篇将深入探讨基于Servlet的会话跟踪技术。 **1. 会话的概念** 会话(Session)是指用户打开浏览器访问网站开始,到关闭浏览器结束的整个过程。在Web应用中,由于HTTP协议本身是无状态的,即服务器无法自动识别...
下面我们将详细探讨这些技术。 首先,URL重写是一种简单但有限制的方法。它通过在URL中添加key-value对来存储信息。这种方法适用于那些不需要跨多个页面或者对安全性要求不高的情况。然而,URL重写存在明显的缺点,...
在探讨J2EE登录人数统计这一经典问题时,我们首先需要理解其核心概念和技术背景。J2EE(Java 2 Platform, Enterprise Edition)是Sun Microsystems(现已被Oracle收购)为简化企业级应用开发而设计的一套标准,它...
在这个主题中,我们将深入探讨如何在EOS平台上利用Java进行简单的运算逻辑编写。 首先,我们需要理解EOS的基础架构。EOS通常采用组件化开发模式,Bizlet是EOS中的一个核心组件,用于封装业务逻辑。Bizlet类似于MVC...
在本文中,我们将深入探讨如何使用JavaServer Pages (JSP) 实现在线人数统计功能,以便展示当前在线的用户数量。我们将分析提供的代码段,并解释关键概念和技术。 首先,我们有一个名为`onLineUser`的类,它实现了`...
本篇文章将详细探讨如何在Struts自定义标签的Java类中获取`HttpSession`对象,并对其应用场景进行深入分析。 ### 一、Struts自定义标签简介 #### 1.1 Struts自定义标签的作用 在Web应用开发中,经常需要在JSP页面...
通过本篇文档的学习,我们不仅了解了如何在JSP中使用`HttpSession`来进行会话管理,还探讨了提高Session安全性的各种策略。这些知识对于构建安全且高效的Web应用程序至关重要。希望本文档能帮助开发者更好地理解和...
本教程将深入探讨Symbian系统中的HTTP连接实例。 首先,我们要了解Symbian中的网络编程基础。Symbian系统使用了RSocketServices和RSockAddr类来处理网络连接。RSocketServices是网络服务的接口,而RSockAddr则用来...
本教程将深入探讨"登录超时完整实例",包括如何进行`session超时设置`以及在`JSP页面`中处理会话超时的问题。 首先,我们需要理解什么是登录超时。登录超时是指用户在一定时间内未进行任何操作,系统自动判断该用户...
现在,让我们深入探讨这些概念及其在实际开发中的应用。 首先,`JspServlet`是JavaServer Pages (JSP) 技术的基础。Servlet是一种Java类,它扩展了服务器的功能,允许我们处理HTTP请求并生成HTTP响应。JSP本质上是...
本篇将深入探讨`Session`的原理、实例以及源码分析,帮助你更好地理解和应用这个关键的技术。 **1. Session的基本概念** 在HTTP协议中,由于其无状态特性,每次请求之间不会共享任何信息。为了保持用户的登录状态,...
本文将深入探讨 Servlet 的最佳实践,涵盖框架的选择、性能优化、配置文件加载、会话管理和单线程模型的使用等方面。 #### 有效使用 Servlet 框架 ##### 选择合适的 Servlet 框架 在选择 Servlet 框架时,重要的...