HTTP协议 ( http://www.w3.org/Protocols/ )是“一次性单向”协议。
服务端不能主动连接客户端,只能被动等待并答复客户端请求。客户端连接服务端,发出一个HTTP Request,服务端处理请求,并且返回一个HTTP Response给客户端,本次HTTP Request-Response Cycle结束。
我们看到,HTTP协议本身并不能支持服务端保存客户端的状态信息。于是,Web Server中引入了session的概念,用来保存客户端的状态信息。
这里用一个形象的比喻来解释session的工作方式。假设Web Server是一个商场的存包处,HTTP Request是一个顾客,第一次来到存包处,管理员把顾客的物品存放在某一个柜子里面(这个柜子就相当于Session),然后把一个号码牌交给这个顾 客,作为取包凭证(这个号码牌就是Session ID)。顾客(HTTP Request)下一次来的时候,就要把号码牌(Session ID)交给存包处(Web Server)的管理员。管理员根据号码牌(Session ID)找到相应的柜子(Session),根据顾客(HTTP Request)的请求,Web Server可以取出、更换、添加柜子(Session)中的物品,Web Server也可以让顾客(HTTP Request)的号码牌和号码牌对应的柜子(Session)失效。顾客(HTTP Request)的忘性很大,管理员在顾客回去的时候(HTTP Response)都要重新提醒顾客记住自己的号码牌(Session ID)。这样,顾客(HTTP Request)下次来的时候,就又带着号码牌回来了。
我们可以看到,Session ID实际上是在客户端和服务端之间通过HTTP Request和HTTP Response传来传去的。
我们看到,号码牌(Session ID)必须包含在HTTP Request里面。关于HTTP Request的具体格式,请参见HTTP协议(http://www.w3.org/Protocols/ )。这里只做一个简单的介绍。
在Java Web Server(即Servlet/JSP Server)中,Session ID用jsessionid表示(请参见Servlet规范)。
HTTP Request一般由3部分组成:
(1)Request Line
这一行由HTTP Method(如GET或POST)、URL、和HTTP版本号组成。
例如,GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1
GET http://www.google.com/search?q=Tomcat HTTP/1.1
POST http://www.google.com/search HTTP/1.1
GET http://www.somsite.com/menu.do;jsessionid=1001 HTTP/1.1
(2)Request Headers
这部分定义了一些重要的头部信息,如,浏览器的种类,语言,类型。Request Headers中还可以包括Cookie的定义。例如:
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Accept-Language: en-us
Cookie: jsessionid=1001
(3)Message Body
如果HTTP Method是GET,那么Message Body为空。
如果HTTP Method是POST,说明这个HTTP Request是submit一个HTML Form的结果,
那么Message Body为HTML Form里面定义的Input属性。例如,
user=guest
password=guest
jsessionid=1001
主意,如果把HTML Form元素的Method属性改为GET。那么,Message Body为空,所有的Input属性都会加在URL的后面。你在浏览器的URL地址栏中会看到这些属性,类似于
http://www.fastfish/login.do?user=guest&password=guest&jsessionid=1001
从理论上来说,这3个部分(Request URL,Cookie Header, Message Body)都可以用来存放Session ID。由于Message Body方法必须需要一个包含Session ID的HTML Form,所以这种方法不通用。
一般用来实现Session的方法有两种:
(1)URL重写。
Web Server在返回Response的时候,检查页面中所有的URL,包括所有的连接,和HTML Form的Action属性,在这些URL后面加上“;jsessionid=XXX”。
下一次,用户访问这个页面中的URL。jsessionid就会传回到Web Server。
(2)Cookie。
如果客户端支持Cookie,Web Server在返回Response的时候,在Response的Header部分,加入一个“set-cookie: jsessionid=XXXX”header属性,把jsessionid放在Cookie里传到客户端。
客户端会把Cookie存放在本地文件里,下一次访问Web Server的时候,再把Cookie的信息放到HTTP Request的“Cookie”header属性里面,这样jsessionid就随着HTTP Request返回给Web Server。
我们来看Tomcat5的源代码如何支持jsessionid。
org.apache.coyote.tomcat5.CoyoteResponse类的toEncoded()方法支持URL重写。
String toEncoded(String url, String sessionId) {
…
StringBuffer sb = new StringBuffer(path);
if( sb.length() > 0 ) { // jsessionid can't be first.
sb.append(";jsessionid=");
sb.append(sessionId);
}
sb.append(anchor);
sb.append(query);
return (sb.toString());
}
我们来看org.apache.coyote.tomcat5.CoyoteRequest的两个方法configureSessionCookie()
doGetSession()用Cookie支持jsessionid.
/**
* Configures the given JSESSIONID cookie.
*
* @param cookie The JSESSIONID cookie to be configured
*/
protected void configureSessionCookie(Cookie cookie) {
…
}
HttpSession doGetSession(boolean create){
…
// Creating a new session cookie based on that session
if ((session != null) && (getContext() != null)
&& getContext().getCookies()) {
Cookie cookie = new Cookie(Globals.SESSION_COOKIE_NAME,
session.getId());
configureSessionCookie(cookie);
((HttpServletResponse) response).addCookie(cookie);
}
…
}
Session的典型应用是存放用户的Login信息,如用户名,密码,权限角色等信息,应用程序(如Email服务、网上银行等系统)根据这些信息进行身份验证和权限验证
1:Session对象在浏览器中的有效范围:
IE中:
1〉.Session对象只在建立Session对象的窗口中有效。
2〉.在建立Session对象的窗口中新开链接的窗口也有效。
Session只会在内存中,他会随着IE窗口的关闭而死亡。
也就是说单用seesion是不会有产生自动登入的效果的。
2:Cookie 是在服务器给客户端IE一个命令后在客户端产生并存的,
它可以存放用户信息,存到客户端硬盘上,在COOKIE记录被删除
或者失效日期之前,就可以实现自动登入的现象。
3:Session 和 Cookie 是不同的,但是他们确实是相关的。
当打开IE登入后,会向服务器发出一个指令请求SESSIONID以
及页面内容,服务器会返回页面内容和一个没有被使用的
SESSIONID让此IE使用,当时IE就对返回SESSIONID做存储;而当此IE再访问任何这个站点的JSP程序的时候,都会给服务器这个 SESSIONID,来确认客户端的身份。(在没有Cookie 的情况下session死亡 SESSIONID被取消就需要重新登入)
4:可以通过客户端禁用和不禁用cookie来验证自己的说法。
相关推荐
在ASP.NET中,Session的实现主要依赖于以下几个核心组件: 1. **HttpSessionState**:这是ASP.NET中用于管理会话状态的对象,它存储和检索特定于用户会话的数据。每个用户的会话都有一个独立的SessionState实例,...
<title>session 实现原理 Cookie [] c = request.getCookies(); if(c==null){ out.println("sorry,cookie is null..."); }else{ for(int m =0;m;m++){ out.println(c[m].getName()+" "+c[m].getValue()...
以上就是使用JSP、Servlet和Session实现购物车功能的基本原理。在这个过程中,JSP和Servlet协同工作,Session起到了关键的会话管理作用,保证了用户在不同页面间操作的连贯性。在实际项目中,可能还需要结合数据库来...
Spring-Session 实现原理源码分析 Spring-Session 是 Spring旗下的一个项目,旨在解决 Session 管理问题。它可以轻松快捷地集成到我们的应用程序中,并提供了多种存储 Session 的方式。下面是 Spring-Session 的...
先说一下需求,我在做一个权限管理的时候,需要在点击某个模块时,Session中相应的改变模块代号,而实现这个操作的是一个a标签,当然我不知道 一个linkbutton是否可以同时将跳转页面和修改Session做了,个人感觉...
### Session的工作原理与概念详解 #### 一、Session的基本概念 在计算机科学中,特别是网络编程领域,“**Session**”一词被广泛使用,并且在不同的上下文中具有不同的含义。通常,Session指的是客户端与服务器...
Springboot实现多服务器session共享 Springboot实现多服务器session共享是指在分布式系统中,每个服务器上的Session可以共享,实现 Session 的同步和共享,从而解决了在分布式环境中Session不一致的问题。下面是...
在实际应用中,session常用于实现用户登录状态的保持,购物车功能,个性化推荐等。例如,当用户登录后,服务器会将用户信息存入session,后续请求中通过session ID就能识别用户身份,从而提供个性化的页面显示。对于...
接下来,我们将详细探讨Session的工作原理,如何利用Session实现用户登录,以及在购物车场景中的应用。 1. Session的工作原理: Session是基于HTTP协议无状态特性的一种补充机制。当用户访问服务器时,服务器会为...
本篇文章将深入探讨如何利用Redis实现Session共享,同时结合Nginx的负载均衡策略,以及Spring Boot的应用框架,构建一个高效、可靠的分布式系统。 一、Session共享的挑战与解决方案 在传统的单体应用中,Session...
本资源将介绍如何利用Session来实现一个购物车功能,特别地,这个购物车是通过链表结构来管理和维护商品信息。 购物车系统是电商网站的核心部分,它允许用户添加、删除和修改选购的商品。在ASP.NET中,由于HTTP协议...
本文将深入探讨SESSION购物车的概念、工作原理以及在实际应用中的重要性。 SESSION是一种服务器端存储用户状态的方法,当用户访问网站并登录或添加商品到购物车时,服务器会为该用户创建一个唯一的SESSION ID,并将...
本篇将详细解释Session的工作原理、配置及其实现用户自动登录的机制。 **一、Session概述** Session是HTTP协议无状态特性的补充,因为在HTTP协议中,每次请求都是独立的,服务器无法识别客户端的连续请求是否来自...
本文将深入探讨如何利用ZooKeeper实现分布式Session,并通过分析提供的"基于ZooKeeper的分布式Session实现.doc"文档,解析其实现原理与步骤。 首先,理解ZooKeeper的基本概念至关重要。ZooKeeper是一个高可用、高...
Session的工作原理是:当用户访问网站并登录后,服务器会为该用户创建一个唯一的Session ID,并将其存储在服务器端。这个Session ID随后会被发送到客户端(通常是通过Cookie),客户端在后续的每次请求时都会携带这...
Session 实现购物车 Session 实现购物车是指通过使用 Session 和 Hashtable 来实现购物车的添加、修改和删除操作。下面是对该技术的解释和知识点总结: 购物车原理 购物车的原理是通过使用 Hashtable 和 Session ...
虽然这个实现方式简化了许多实际项目中的复杂性,但它为初学者提供了一个了解`Session`工作原理和实现基本购物车功能的良好起点。在实际开发中,通常会结合数据库存储购物车信息,以支持更多功能,如持久化购物车、...
"tomcat-redis-session-manager"是一个解决方案,它将用户的Session信息存储在Redis缓存服务器中,从而实现跨服务器的Session共享。本篇文章将深入探讨这个话题,包括它的原理、配置以及实际应用。 **一、Session...