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传递回服务器。
session何时被删除
session在下列情况下被删除:
A.程序调用HttpSession.invalidate()
B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
C.服务器进程被停止
再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。
URL重写有什么缺点
对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。
这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servlet或JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSION ID已经过期了。
使用隐藏的表单域有什么缺点
仅当每个页面都是有表单提交而动态生成时,才能使用这种方法。单击常规的<A HREF..>超文本链接并不产生表单提交,因此隐藏的表单域只能用于一系列特定的操作中,比如在线商店的结账过程。
如何将信息与会话关联起来
setAttribute会替换任何之前设定的值;如果想要在不提供任何代替的情况下移除某个值,则应使用removeAttribute。这个方法会触发所有实现了HttpSessionBindingListener接口的值的valueUnbound方法。
会话属性的类型有什么限制吗
通常会话属性的类型只要是Object就可以了。除了null或基本类型,如int,double,boolean。
如果要使用基本类型的值作为属性,必须将其转换为相应的封装类对象
使用isNew来判断用户是否为新旧用户的错误做法
public boolean isNew()方法如果会话尚未和客户程序(浏览器)发生任何联系,则这个方法返回true,这一般是因为会话是新建的,不是由输入的客户请求所引起的。
但如果isNew返回false,只不过是说明他之前曾经访问该Web应用,并不代表他们曾访问过我们的servlet或JSP页面。
因为session是与用户相关的,在用户之前访问的每一个页面都有可能创建了会话。因此isNew为false只能说用户之前访问过该Web应用,session可以是当前页面创建,也可能是由用户之前访问过的页面创建的。
正确的做法是判断某个session中是否存在某个特定的key且其value是否正确
是否只要关闭浏览器,session就消失了
程序一般都是在用户做log off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器根本不会有机会知道浏览器已经关闭。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。
之所以会有这种错误的认识,是因为大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session。
如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求报头,把原来的session id发送到服务器,则再次打开浏览器仍然能够找到原来的session。
恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为session设置了一个失效时间,当距离客户上一次使用session的时间超过了这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。
由此我们可以得出如下结论:
关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。
如何使用会话显示每个客户的访问次数
由于客户的访问次数是一个整型的变量,但session的属性类型中不能使用int,double,boolean等基本类型的变量,所以我们要用到这些基本类型的封装类型对象作为session对象中属性的值
但像Integer是一种不可修改(Immutable)的数据结构:构建后就不能更改。这意味着每个请求都必须创建新的Integer对象,之后使用setAttribute来代替之前存在的老的属性的值。例如:
HttpSession session = request.getSession();
SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);
if (value= =null){
value = new SomeImmutableClass(…); // 新创建一个不可更改对象
}else{
value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对象
}
session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象
如何使用会话累计用户的数据
使用可变的数据结构,比如数组、List、Map或含有可写字段的应用程序专有的数据结构。通过这种方式,除非首次分配对象,否则不需要调用setAttribute。例如
HttpSession session = request.getSession();
SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);
if(value = = null){
value = new SomeMutableClass(…);
session.setAttribute(“someIdentifier”,value);
}else{
value.updateInternalAttribute(…); // 如果已经存在该对象则更新其属性而不需重新设置属性
}
分享到:
相关推荐
**HttpSession详解** 在Web开发中,`HttpSession` 是一个至关重要的概念,它属于Java Servlet API的一部分,用于在客户端浏览器和服务器之间存储状态信息。当你需要在用户的不同请求之间保持某些数据时,例如购物车...
#### 三、HTTPSession详解 - **获取Session**:通过`HttpSession session = request.getSession(true);`可以获取到当前用户的Session。如果参数为`true`且当前没有Session,则会创建一个新的Session;如果是`false`...
### WebSocket 区分不同客户端两种方法详解 #### 一、引言 在现代Web应用开发中,WebSocket技术因其能够实现实时双向通信的特点而被广泛应用于各种场景,尤其是在即时通讯领域。然而,随着应用场景的复杂化,如何...
### Cookie与Session机制详解 #### 一、Cookie与Session的概念及区别 在Web开发中,为了保持用户的状态信息,通常会用到两种技术:Cookie和Session。这两种技术都是用来跟踪用户的浏览活动,但它们的工作原理有所...
### Session的工作原理与概念详解 #### 一、Session的基本概念 在计算机科学中,特别是网络编程领域,“**Session**”一词被广泛使用,并且在不同的上下文中具有不同的含义。通常,Session指的是客户端与服务器...
### Session详解 #### 一、引言 在Web开发领域,`Session`是一个核心概念,尤其是在涉及用户状态管理和个性化体验的场景中。虽然Session的概念和技术已经存在多年,但很多开发者仍对其工作原理和最佳实践不够熟悉...
"jsp中session的用法详解" jsp 中 session 的使用方法可以帮助开发者追踪用户的操作过程,而不需要担心追踪的实现细节。Session 是一种服务器端的机制,用于存储用户的信息,以便在多个页面之间共享数据。 在 jsp ...
### web.xml配置文件详解 #### 一、概述 `web.xml`是Java Web应用程序的核心配置文件之一,主要用于定义Web应用程序的结构与行为。它是Servlet容器(如Tomcat)读取Web应用程序配置信息的主要来源,因此深入理解其...
可以通过使用`HttpSession`的`setMaxInactiveInterval`方法显式设置单个会话对象的超时值,或者利用`<session-config>`元素指定默认超时值。 - **`<mime-mapping>`**:如果Web应用具有特别的MIME类型映射需求,则...
【跨服务器session应用详解】 在Web开发中,session机制是一种至关重要的技术,它允许服务器在多个请求之间跟踪用户的状态,从而实现动态交互和个性化服务。本文将深入探讨session的工作原理,以及如何在Java Web...
- **session对象**:`javax.servlet.http.HttpSession`,用于跟踪用户的会话信息。`session.getAttribute()`和`session.setAttribute()`用于存储和获取会话数据,`session.invalidate()`则用于结束会话。 - **...
4. **`session`**:代表HTTP会话,类型为`javax.servlet.http.HttpSession`。它用于跟踪用户的会话状态,例如购物车中的商品或用户登录信息。 5. **`application`**:类型为`javax.servlet.ServletContext`,代表...
### Session详解:深入探讨Web应用中的状态管理 #### 一、Session的概念与多义性 在Web开发领域,"Session"一词的含义繁杂且容易引起混淆,它既可指代用户与服务器之间一系列交互的集合,也可特指实现这种交互背后...
SpringBoot 中 Session 超时原理说明 在 SpringBoot 中,Session 超时是指在一定时间内没有任何操作,Session 就会超时失效,导致用户需要重新登录才可以继续访问页面。这是因为 Session 的超时时间是有限制的,...
- **会话管理**:`getSession()`方法可以创建或获取与当前请求关联的`HttpSession`对象,用于存储特定用户的会话信息。 3. **安全性**: - 可以通过`isSecure()`方法检查请求是否通过HTTPS进行加密传输。 4. **...
### Servlet详解 #### 1. Servlet工作原理 Servlet是一种服务器端的小程序,主要用来处理HTTP请求并返回HTTP响应。Servlet由Servlet容器(如Tomcat、Jetty等)管理其生命周期,这种容器通常作为Web服务器的一部分...
Servlet、Filter、Listener 详解 Servlet 是运行在服务器上的小程序,它可以使任何 Java 应用程序、浏览器或任何设备。Servlet 的客户端可以提出请求并获得该请求的响应。Servlet 在初始化后即驻留内存中,因此每次...
9.2.1 httpsession接口 306 9.2.2 session的生命周期 307 9.2.3 cookie的应用 319 9.2.4 httpsessionbindinglistener接口 328 9.2.5 在线人数统计程序 329 9.3 小结 335 第10章 servlet的异常处理机制 337 ...
【Session机制详解】 Session机制是Web应用程序中用于保持客户端与服务器之间状态的一种技术。在HTTP协议下,由于其无状态的特性,每次请求之间是相互独立的,这意味着服务器无法识别同一用户的不同请求。为了实现...
9.2.1 httpsession接口 306 9.2.2 session的生命周期 307 9.2.3 cookie的应用 319 9.2.4 httpsessionbindinglistener接口 328 9.2.5 在线人数统计程序 329 9.3 小结 335 第10章 servlet的异常处理机制 337 ...