session会话技术本质分析

来源:互联网 发布:淘宝怎样开通花呗支付 编辑:程序博客网 时间:2024/06/05 10:08

一.为什么出现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 = "<a href='"+ url +"'>jingtao </a>";response.getWriter().print(content); 

3:encodingUrl 和 encodeRedirectURL的区别
/** * encodeURL ()与 encodeRedirectURL()最大的区别在与: * 如果是""空字符串的处理不同 *  */System.out.println(response.encodeURL("")); // http://localhost:8199/web_servlet/;jsessionid=ADDF8C9D89C1166D726E0691630B92AASystem.out.println(response.encodeRedirectURL(""));

0 0
原创粉丝点击