Http协议
首先Http协议是无状态的连接方式,即客户端访问服务端,服务端是不会记录客户端访问服务端的状态的。HTTP无状态协议,是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
客户端与服务器进行动态交互的Web应用程序出现之后,HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。HTTP本身是一个无状态的连接协议,为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为交互存储状态,而这些不同的技术就是Cookie和Session了。
-
协议对于事务处理没有记忆能力
-
对同一个url请求没有上下文关系
-
每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求时无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况
-
服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器(cookie的jsession)
HTTP会话跟踪技术
-
Cookie(结合session使用):**客户端 **如果没有指定Cookie的时效,那么默认的时效是会话级别(api设置单位为second[秒])
-
Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话。**服务端 **tomcat默认session有效期是30分钟(api设置单位为second[秒],.xml文件配置是以分(min)为单位)
-
URL 重写
-
隐藏的表单域
JSESSIONID说明
这是一个保险措施,因为Session默认是需要Cookie支持的。
但有些客户浏览器是关闭Cookie的这个时候就需要在URL中指定服务器上的session标识。(无痕模式cookie是无法保存的)
http本身是无session的,无法跟踪客户端的信息,换句话说:http协议不管是谁连接自己。
为了实现session,必须有浏览器支持。浏览器可以用cookie存储session,这是最通用的做法。
但是,如果我自己写一个完全符合http协议的浏览器,但是不配合服务器的session要求,那么服务器就无法产生session。
好在现在的浏览器都支持session要求,即使关闭了cookie,浏览器也会向服务器传递sessionid,这个id是存储在浏览器的内存空间中的,不保存在硬盘cookie中。
在http的报文格式里面cookie和session是在同一个包文位置上的如果ie发现包文里面包含cookie/session的信息的话,他会根据安全级别来决定是否保存相关信息,比如,如果安全机制允许使用cookie那么ie将把cookie的信息保存到临时文件里面,每次在请求服务器文件的时候会把收到的session的信息加入到请求的报文里面,这就是session保存信息的原理。
如果安全机制不允许使用cookie的话,虽然ie收到了cookie和session的信息,那么cookie的信息不会被写入临时文件,当ie再次请求服务器文件的时候,也不会把收到的session的信息加入到请求报文里面,服务器就无法知道session的信息了。
流程就是:session->jsessionid->cookid->请求头(RequestHeader)