Cookie&Session的运行原理分析

Cookie运行过程分析      

         当客户端和服务端的多次请求响应过程中,需要将部分数据以Cookie的形式保,存在客户端,执行过程如下

简介:

    服务端有ServletDemo01,ServletDemo02,当从浏览器向服务端的ServletDemo01发起请求

    在ServletDemo01中创建2个Cookie对象,分别设置cookie对象的有效期,路径,之后发送cookie.   

    当浏览器识别到Set-Cookie响应头后,会在客户端保存2个Cookie对象,

    不同的浏览器保存的位置和方式不同,IE保存在cookies文件夹下,火狐浏览器保存在自带的数据库软件中SQLLite中

    这2个Cookie对象分别有个自己的键值对,有效期和路径.

    当浏览器向ServletDemo01或者ServletDemo02发起请求时,由于ServletDemo02和

    ServletDemo01都拥有共同的路径test,也就是都在项目test下,那么本次请求会将刚才

    保存的cookie对象携带在HTTP的请求部分发送到服务端,在ServletDemo02中可以获取到这2个cookie对象

Cookie解惑

1_Cookie为什么有路径?

         客户端的浏览器下是有很多来自不同网站的Cookie对象的,如果我们

   没有路径,可能会将来自百度的Cookie发送给Google,这样Google就获取

   到了来自百度的Cookie这是不允许的.

         总之当我们向某个WEB项目发起请求时,仅仅是将和这个项目

  相关的Cookie对象发送到了相关的WEB项目.

2_当Cookie过了有效期,将不再向服务端发送,浏览器会自行处理

3_cookie中不会以明文的形式存储重要的数据

Cookie的应用

1_保存用户的用户名

2_记录用户的行为,例如,京东商场左下角有一个最近访问的产品记录信

    息,当当网上有你最近浏览过的书籍信息,都是根据用户访问页面,记

     录到cookie的信息来制作的。

3_电商购物车的处理,因为在不同页面,点击添加到购物车,这个信息也

     是记到了cookie里面。结账的时候统一提交

4_定制页面。如果网站提供了换肤的功能,我们这个时候也是将他记录到

    cookie里面,以便下次访问还是保持原来的风格页面。


Session运行过程分析:    

    当mary的浏览器向服务端的ServletDemo01发起的请求需要保存一些数据时,而且数据保存在服务端时,可以调用request.getSession()在服务端创建一个session对象.底层的实现过程为Tomcat在内存中生成一个叫做sessionid的随机的字符串,通过这个sessionid,在服务端为mary的本次会话关联一个session对

象,session对象中有各种属性,其中还封装了一个空map对象(用于存放程序运行过程也能够中产生的数据)

    当tomcat对本次请求进行响应时将内存中生成的sessionid在响应头以cookie的形式发送到浏览器端,此后当浏览器再次向服务端的Sevlet01发起请求时,会将sessionid再次发送到服务端,tomcat通过sessionid,就可以找到在服务端为mary开辟的服务端的session对象

    当jack的浏览器向服务端的ServletDemo01发起请求需要为jack的会话保存数据时,tomcat也为jack的会话创建sessionid,和sessionid对应的在服务端也会有一个session对象和jack的会话关联,以后再jack和浏览器的

多次请求响应中,都维护了sessionid,通过这个sessionid就可以找到服务端为jack建立的session对象,就可以向session中存放键值对的数据

    此后只要jack和mary的浏览器没有关闭的前提下,对服务端的其他动态资源访问时,就可以将各自维护的sessioinid发送到服务端,那么tomcat就可以通过这个

    sessionid获取到为jack和mary建立的session对象,就可以向其中存储和获取各自独立的数据.


*_获取session的方法是:request.getSession();


执行过程为

    tomcat看本次请求的请求头是否通过请求头携带过一个sessionid

1_如果没有,新建一个随机的字符串,并创建一个和这个随机字符串关联的session对象.

2_如果有,通过这个随机的字符串看内存中是否已经存在一个和其相等的字符串

    2.1_存在,说明之前创建过session对象,那么获取到这个session对象返回即可.

    2.2_不存在,说明之前的session已经销毁或者是用户在伪造session

        则在服务端没有一个和这个字符串的值相等的字符串,此时新建一个

        随机的字符串, 并创建一个和这个随机字符串关联的session对象.

Session的本质

     服务端为各个不同的客户端创建了一个对象,这个对象在服务端,用来保存来自各个客户端的数据

Sssion的生命周期

 创建:当用户访问服务端时,首次碰到request.getSession()

当用户访问服务端时,访问servlet或者jsp页面时会自动创建Session

 销毁:1_服务器非正常关闭

         2_session超时(默认30分钟,可以配置)

         3_session销毁

  注意:

      服务器正常关闭,session对象不在内存中,被序列化到硬盘上, 此时重新启动服务器,

      还是可以将session加载到内存中的

何为一次会话?

     客户端和服务端交互过程中,session有效期期间的请求响应为一次会话.

浏览器关闭:

    sessionid是以cookie的形式来实现的,而且对应的cookie是会话级别的,有效期为0.

     浏览器关闭,随机的字符串将无法向服务端传递.

Servlet中提到的3个域对象是什么?如何理解

易混淆的API

读取配置文件的:

  *.getInitparameter(“”)  *.getInitparameterNames()

读取表单参数

   req.getParameter(name);  req.getParameterValues(name);

   req.getParameterMap();

读取HTTP协议请求头

   req.getHeader(name);  req.getHeaderNames();

控制域对象

   *.setAttribute(“name”,”value”);

   *.removeAttribute(“name”);

   *.getAttributeNames();

发表评论