会话跟踪技术综述 - zhangzl419 - 博客园 (cnblogs.com)
四种会话跟踪技术的对比 - 不完全個体 - 博客园 (cnblogs.com)
基本介绍:
会话和会话跟踪介绍:
会话(session),指的是web应用程序中客户端浏览器与服务器之间的一系列的请求响应动作。
在Web应用程序中,服务器端和客户端之间交互使用的是Http协议,但是Http协议是一个无状态的协议,这里无状态的含义是每一个服务器和客户端之间的连接和它之前的连接之间是没有任何关系的,这是协议本身规定的。
虽然http协议规定相邻的两次请求之间是没有关联的,但是开发者开发web应用程序时为了实现一些功能(比如用户登录后访问资源就不需要再验证了)希望多次请求之间有关联,这就不能用http协议本身来实现会话了,因此也就有了其他的实现会话的方法,这些方法就叫会话跟踪技术。
会话跟踪是一种灵活的机制,虽然HTTP是一种无状态协议,但会话跟踪技术使Web上的状态编程成为可能,目前普遍存在四种会话跟踪技术:URL重写、隐藏表单域、Cookie、Session。
web应用程序中,在客户端对服务器端的多次请求之间建立联系,从而让多次请求形成一个会话,那么就相当于对请求进行了跟踪,第一次请求完了,跟着第二次请求,第二次请求完了,跟着第三次请求,如此多次,直到彻底关闭浏览器,这多次请求构成了一个会话,就是一个客户端和服务器端的对话session,这就是会话跟踪的含义,也就是它的概念。
因此,会话的实现方法又被称为会话跟踪技术。从这里可以看出会话跟踪是人们另外想出来的技巧,并不是客户端、服务器端(包括web服务器软件和web应用软件)、http协议这三者的本来有的功能,因此它只能被称为技术。
会话跟踪技术介绍:
那么,会话跟踪技术有哪些呢?
从原理上来分析,客户端和服务器之间的交互协议http不保存相邻两次请求之间的联系或者状态,那么要实现会话跟踪就要在客户端、服务器端、http协议三方面下工夫了。
目前,主要使用的会话跟踪技术有这么四种:
(1)cookie,cookie是客户端的会话跟踪技术,它是在客户端这边实现的会话跟踪技术。
(2)session,session是服务器端(指的web服务器软件本身,而不是web应用程序)的会话跟踪技术(这里的session是session的另一个含义),它是在服务器端这边实现的会话跟踪技术。
session是依赖cookie的,如果浏览器的用户禁用了cookie,那么session也将失效,这种情况下,还想实现会话跟踪的话就需要url重写技术和隐藏表单域技术了。
(3)url重写,是在http协议上实现的会话跟踪技术,是在cookie和session失效的情况下
(4)隐藏表单域,它是web应用程序上实现的会话跟踪技术
不过,目前实践中使用最频繁的还是 session 来实现会话跟踪。当然具体到一个web应用程序中用什么技术实现会话跟踪,就取决于做这个web应用程序的工程师了,他熟悉什么,会使用什么可能就使用什么了。
会话跟踪技术详解:
隐藏表单域:
<input type="hidden" id="xxx" value="xxx">
特点:
- (参数存放)参数是存放在请求实体里的,因此没有长度限制,但是不支持 GET 请求方法,因为 GET 没有请求实体
- (Cookie禁用)当Cookie被禁用时依旧能够工作
- (持久性)不存在持久性,一旦浏览器关闭就结束
URL 重写:
可以在 URL 后面附加参数,和服务器的请求一起发送,这些参数为键/值对
特点:
- (参数存放)参数是存放在 url 里的,有1024长度限制
- (Cookie禁用)当Cookie被禁用时依旧能够工作
- (持久性)不存在持久性,一旦浏览器关闭就结束
Cookie:
cookie是通过客户端进行会话跟踪的技术。从定义上来说,cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息,有了cookie这样的技术,服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头的cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。
Session:
与cookie相对的一个解决方案是session,它是通过服务器端进行会话跟踪的技术。
需要在这里明确一下Session的含义。首先,我们通常都会把Session翻译成会话,因此我们可以把客户端浏览器与服务器之间一系列交互的动作称为一个Session。从这个定义出发,我们会提到Session持续的时间,会提到在Session过程中进行了什么操作等等;其次,Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于会话跟踪的。从这个语义出发,我们则会提到往Session中存放什么内容,如何根据键从Session中获取值等。
要使用Session,第一步当然是创建Session了。那么Session在何时创建呢?当然还是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法。
而在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了,从而,看起来多个请求属于同一个session了,就是现实了会话跟踪的目的。
JavaWeb应用中session的存储位置:
在Java Web应用中,session 对象是由服务器端创建的,用于存储用户会话信息。默认情况下,session 数据是存储在Tomcat、Jetty、WildFly等Servlet容器的内存中的。这意味着每个用户的会话数据都保存在服务器的内存里,这提供了快速的数据访问。
然而,Servlet容器提供的session管理机制通常允许开发者配置session的存储位置和持久化策略。以下是几种常见的配置:
- **内存存储**:
- **持久化存储**:
- **分布式session管理**:
- **外部session管理器**:
- **云服务**:
在实际应用中,选择哪种session存储方式取决于应用的需求,包括数据持久性、可用性、性能和成本等因素。例如,对于需要高可用性和数据持久性的应用,可能会选择数据库或云服务来存储session数据。而对于需要快速访问session数据的应用,可能会选择内存或缓存系统。