热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

session会话技术本质分析

一.为什么出现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(""));


推荐阅读
author-avatar
亦涵Doris
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有