作者:亦涵Doris | 来源:互联网 | 2023-05-18 06:19
一.为什么出现session回话技术?(作用)在分析这个问题开始之前,先分析下http的特点1."一次性":客户端与服务器建立连接,发送httprequest请求,服务器处理请
一.为什么出现session回话技术?(作用)
在分析这个问题开始之前,先分析下http的特点
1. "一次性":客户端与服务器建立连接,发送http request请求,服务器处理请求, 并返回http response.一个http request response cycle完成.
2."单向":服务器不能主动向客户端发送请求,只能对客户端发来的请求做处理;客户端能主动向服务器发送请求.
3. "无状态":http协议并不支持服务器保存客户端的信息 .也就是说你访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你.
然后分析下COOKIE的作用是什么呢?
1.COOKIE是服务器将数据保存到客户端,然后再由客户端将信息发送回来的技术.
2.它的目的是为了使http 协议变成有状态的连接,然后就可以共享一些数据.
3.单单重这方面来说:COOKIE是客户端和服务器端进行有状态连接的保证.(这个时候COOKIE更像是标识信息,本来http就是通过在COOKIE中放入 sessionId来实现有状态的)
接着分析为什么出现session呢?
由于服务器通过COOKIE将数据保存在客户端有太多的限制:
客户端空间有限.
用户可以禁用该COOKIE
对于这个问题我们可以将数据保存在服务器端, 然后将该空间内存的地址通过COOKIE进行传送.这就相当于在服务器端共享数据(相对于一个指针),这也是session的本质,只不过他是将内存地址用Id来表示而已.
这时候就出现了session回话 跟踪技术.
二:什么是session回话技术呢?它的工作方式是什么呢?
什么是session?
session是服务器在服务器端开辟的一块内存空间, 用来保存用户的信息.
session是通过COOKIE来传递sessionID来保证每一个会话都是有状态的.
这里用一个形象的比喻来解释session的工作方式。(假设Web Server是一个商场的存包处,HTTP Request是一个顾客)
1.第一次来存包处,管理员把顾客的物品存放在某一个柜子里面(这个柜子就相当于Session),然后把一个号码牌交给这个顾客,作为取包凭证(这个号码牌就是Session ID)
2.顾客(HTTP Request)下一次来的时候,就要把号码牌(Session ID)交给存包处(Web Server)的管理员。
3.管理员根据号码牌(Session ID)找到相应的柜子(Session),根据顾客(HTTP Request)的请求,Web Server可以取出、更换、添加柜子(Session)中的品,WebServer也可以让顾客(HTTP Request)的号码牌和号码牌对应的柜子(Session)失效。
4.我们可以看到,Session ID实际上是在客户端和服务端之间通过HTTP Request和HTTP Response传来传去的。
三:如何实现session回话技术呢?
1:如何获得session对象呢?
/* 如果不存在则tomcat帮助我们创建, 如果已经存在,则返回与该请求相关联的session
本质:
他是先获得COOKIE中的session id
然后再根据这个ID获得制定的session对象.
*/
HttpSession session = request.getSession();
2:如果COOKIE被禁用了, 那么如何保持http协议的有状态性质呢?
/*
* 如果可以通过COOKIE来传递session id ,那么则直接返回
如果不可以, 则对该字符串进行session id追加.
路径参数:
这个方法虽然是在服务器端运行的, 但是仅仅是追加而已. 因此相对跟路径是web站点的路径.
格式:http://localhost:8199/web_servlet/tt;jsessiOnid=9BC8DF646DD6DA855E4798DAA5C926F7
注意这里并不是通过查询字符串进行追加的 而是直接通过另外一种方式
*/
String url = response.encodeURL("/web_servlet/tt");
String cOntent= "jingtao ";
response.getWriter().print(content);
3:encodingUrl 和 encodeRedirectURL的区别
/**
* encodeURL ()与 encodeRedirectURL()最大的区别在与:
* 如果是""空字符串的处理不同
*
*/
System.out.println(response.encodeURL("")); // http://localhost:8199/web_servlet/;jsessiOnid=ADDF8C9D89C1166D726E0691630B92AA
System.out.println(response.encodeRedirectURL(""));