1、基于Cookie实现Session
Session对象的原理在于,服务器可以为客户端创建并维护一个所谓的Session对象,用于存放数据。在创建Session对象的同时,服务器将会为该Session对象产生一个唯一编号,这个编号称之为SessionID,服务器以Cookie的方式将SessionID存放在客户端。当浏览器再次访问该服务器时,会将SessionID作为Cookie信息带到服务器,服务器可以通过该SessionID检索到以前的Session对象,并对其进行访问。需要注意的是,此时的Cookie中仅仅保存了一个SessionID,而相对较多的会话数据保存在服务器端对应的Session对象中,由服务器来统一维护,这样一定程度保证了会话数据安全性,但增加了服务器端的内存开销。
存放在客户端的用于保存SessionID的Cookie会在浏览器关闭时清除。我们把用户打开一个浏览器访问某个应用开始,到关闭浏览器为止交互过程称为一个“会话”。在一个“会话”过程中,可能会向同一个应用发出了多次请求,这些请求将共享一个Session对象,因为这些请求携带了相同的SessionID信息。
1. Session工作原理
下面的Servlet用来演示Session的工作原理:
- publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
-
throwsServletException,IOException{
-
response.setContentType("text/html");
- PrintWriterout=response.getWriter();
-
Stringoption=request.getParameter("option");
-
if("create".equals(option)){
-
- HttpSessionsession=request.getSession();
-
-
session.setMaxInactiveInterval(30);
-
-
Listlist=(List)session.getAttribute("list");
-
if(list==null){
-
list=newArrayList();
-
list.add("hey");
-
-
session.setAttribute("list",list);
-
}else{
-
list.add("hey");
- }
- out.println(list);
-
}elseif("invalidate".equals(option)){
-
HttpSessionsession=request.getSession(false);
-
if(session!=null){
-
- session.invalidate();
- }
- }
该Servlet的url-pattern为/testSession。
当浏览器请求地址“.../tst/testSession?option=create”时,Servlet调用request的getSession方法获得Session对象,如果此时服务器端存在与请求信息中SessionID(作为Cookie信息携带)对应的Session对象,则返回这个Session对象,否则将会创建一个新的Session对象并将其产生的SessionID以Cookie的形式通过响应信息送回。注意,Session对象的setMaxInactiveInterval方法用于设置最长不活动间隔,单位是秒,如果出现在这个的时间段内Session对象没有被存取,则该Session对象将会失效。通常为了保证服务器的性能和出于安全性考虑,这个值要妥善的设置(Tomcat针对Session的MaxInactiveInterval会有默认的设置)。若setMaxInactiveInterval设置为负值,则表示该Session永不过期。另外,Session对象分别通过setAttribute和getAttribute方法存取数据,数据以“名称-对象”对的形式存放。该请求对应的请求和响应的HTTP信息为:
- 请求:
-
GET/tst/testSession?option=createHTTP/1.1
- Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/x-silverlight,**
- Accept-Language:zh-cn
- UA-CPU:x86
- Accept-Encoding:gzip,deflate
-
User-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)
-
Host:192.168.5.100:8080
- Connection:Keep-Alive
- Cookie:JSESSIONID=C69B3053C575ECC8C7FCAF7D189A4FD1
- 响应
-
HTTP/1.1200OK
-
Server:Apache-Coyote/1.1
-
Content-Type:text/html;charset=ISO-8859-1
-
Content-Length:12
-
Date:Sun,29Jun200807:20:41GMT
- [hey,hey]
注意:请求信息中携带的SessionID值与上一次相应的SessionID之一致。另外响应输出的HTML文本中有两个“hey”,这是因为这次请求Servlet往存放在Session中的list对象中又放置了一个String对象。
当浏览器请求“.../tst/testSession?option=invalidate”时,Servlet会调用Session对象的invalidate方法用于使该Session对象失效。需要注意的是,此时获取Session对象的方法为重载的getSession(boolean b)其中boolean类型的参数表示当前请求没有和服务器端的某个Session对象关联时是创建新的Session(参数为true时)还是返回null(参数为false时)。
2、基于URL重写
从上面的介绍可以看出,Session对象的正常使用要依赖于Cookie。如果考虑到客户端浏览器可能出于安全的考虑禁用了Cookie,应该使用URL重写的方式使Session在客户端禁用Cookie的情况下继续生效。
下面有两个JSP页面:1.jsp中向Session对象中存入了名为“hi”的一个String类型对象。通过超级链接可以链接到2.jsp,在2.jsp中将获取Session中名为“hi”的对象,并显示在页面上。需要注意的是:在1.jsp中超级链接的地址并不是直接写了“2.jsp”而是通过resopnse的encodeURL方法对这个地址进行了处理。
1.jsp
- <%
-
session.setAttribute("hi","Doyouworkorareyouastudent?");
- %>
-
<ahref="<%=response.encodeURL("2.jsp")%>">2.jsp</a>
2.jsp
- <%=session.getAttribute("hi")%>
首先将浏览器的Cookie禁用(注意要重启IE),然后请求1.jsp,响应后点击链接到2.jsp,这个交互过程涉及到两次请求和相应,HTTP信息如下:
- 请求1.jsp
-
GET/tst/session/1.jspHTTP/1.1
- Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/x-silverlight,**
-
Referer:http:
- Accept-Language:zh-cn
- UA-CPU:x86
- Accept-Encoding:gzip,deflate
-
User-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)
-
Host:192.168.5.100:8080
- Connection:Keep-Alive
- 响应:
-
HTTP/1.1200OK
-
Server:Apache-Coyote/1.1
-
Content-Type:text/html;charset=ISO-8859-1
-
Content-Length:33
-
Date:Sun,29Jun200807:31:36GMT
- Doyouworkorareyouastudent?
注意:由于Cookie的禁用,这次请求协议头中虽然没有携带SessionID的信息,但SessionID的信息作为请求地址的一部分传到了服务器端,这就是URL重写的意义所在。
response的encodeURL方法将根据浏览器是否不支持Cookie决定是否将SessionID信息写入链接地址。
分享到:
相关推荐
在Web开发中,Session 和 Cookie 是两种常用的技术,用于维护客户端与服务器之间的状态信息。它们各有特点,在不同的场景下发挥着重要作用。 - **Cookie**:Cookie是一种在客户端存储少量数据的方式。每当用户访问...
【描述】:这篇文章讨论了session和cookie在Web开发中的重要角色,解释了它们如何帮助维持用户状态,并且介绍了这两种机制的基本概念。 【标签】:“session机制与cookie机制” 【内容】: 一、术语 session ...
Session是一种服务器端的会话管理机制,它允许我们在用户的不同请求之间保持状态信息。 **1. Session的基本概念** Session是服务器为每一个浏览器会话创建的一个对象,用于存储特定用户的数据。当用户访问网站时,...
为了解决这一问题,开发了两种主要的状态管理机制:Cookie机制和Session机制。 #### 二、术语解释:Session 在不同的上下文中,"session"这个词有着不同的含义,尤其是在网络通信和Web开发领域。通常,"session...
cookie 机制和 session 机制是两种常用的Web会话跟踪机制,虽然它们都可以实现会话跟踪,但它们的实现机制和应用场景却有所不同。 首先,cookie 机制是一种客户端保持状态的方案。它通过在客户端浏览器中存储一个小...
Session 的实现方式有两种,一种是通过 Cookie,另一种是通过 URL 重写。 通过 Cookie 实现 Session Cookie 是保存在客户端的一小段信息,服务器在响应请求时可以将一些数据以“键-值”对的形式通过响应信息保存...
【Cookie与Session机制】在Web开发中,会话跟踪是必不可少的技术,用于区分不同用户的操作。常见的会话跟踪手段有...在Session项目中,可以深入学习和实践这两种技术,理解它们的工作原理以及何时、如何使用它们。
Cookie机制与Session机制是两种常用的状态管理方式,它们各自拥有独特的功能与应用场景,对于理解两者之间的区别与联系至关重要。 #### Cookie机制 Cookie是一种小型的数据文件,由服务器端生成并发送到用户浏览器...
在Web开发中,为了保持用户的状态信息,通常会用到两种技术:Cookie和Session。这两种技术都是用来跟踪用户的浏览活动,但它们的工作原理有所不同。 **Cookie** 是一种客户端技术,用于存储一些简单的数据在用户的...
Spring-Session正是为此而设计的一个框架,它提供了一种机制来存储用户的会话信息至中央数据存储区,如Redis等,从而实现跨服务共享。 #### 一、Spring-Session简介 Spring-Session是Spring框架提供的一个用于管理...
**Cookie** 和 **Session** 是两种常见的用于在Web应用程序中维护用户状态的技术。 - **Cookie**:是一种客户端存储技术,服务器可以通过HTTP响应向客户端发送一些数据(即Cookie),浏览器会保存这些数据,并在...
在Web开发中,Cookie和Session是两种常见的用户身份验证机制,尤其在C#编程语言中,它们被广泛用于实现登录功能。本实例将探讨如何在C#环境下利用Cookie和Session来处理用户登录状态。 首先,我们要理解Cookie和...
这两种工具可以作为中央存储库,存放所有服务器的Session数据。当用户在集群中的任何一台服务器上发起请求时,服务器会查询分布式缓存来获取或更新Session信息。 以Redis为例,我们可以使用Java的Jedis库来与Redis...
为了解决这个问题,我们需要一种机制来实现Session共享。 Nginx可以配置成使用 sticky module 或者 upstream模块,通过特定的负载均衡策略,如IP哈希,确保来自同一用户的请求总是被转发到同一台Tomcat服务器。但这...
Session 和 Cookie 是两种常用的Web开发技术。Session 是一种服务器端的存储机制,用于存储用户的会话信息。Cookie 是一种客户端的存储机制,用于存储用户的信息。在网站开发中,Session 和 Cookie 广泛应用于实现...
Spring Session通过Redis的发布/订阅(Pub/Sub)机制实现了这一点,确保了分布式环境中的Session一致性。 7. **性能优化**: 考虑到Redis的网络延迟,我们可以使用Session Replication策略(如 sticky session)来...
为了实现状态的持续,出现了Session和Cookie这两种技术。Session是一种存储在服务器端的记录,它能够存储特定用户会话所需的信息,而Cookie则是存储在客户端的数据,通常用于辨别用户身份及跟踪会话。本文将详细探讨...
有两种方式,一种是作为URL路径的一部分,另一种是作为查询字符串。 - 表单隐藏字段:较旧的技术是通过在HTML表单中添加隐藏字段来传递Session ID,但这现在已经较少使用。 3. Session的生命周期: - 用户登录或...
使用 Session 共享也分两种机制: ① 粘性 Session 处理方式原理:不同的 Tomcat 指定访问不同的主 Memcached。多个 Memcached 之间信息是同步的,能主从备份和高可用。 ② 非粘性 Session 处理方式原理:Memcached...