Rumah > Java > javaTutorial > cookie和session的会话和会话状态讲解

cookie和session的会话和会话状态讲解

巴扎黑
Lepaskan: 2017-07-17 14:30:29
asal
2024 orang telah melayarinya

一、会话概述

1)现象:HTTP协议是一种无状态的协议,Web服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是完全孤立的。

2)解决:借助会话状态,Web服务器能够把属于同一会话中的一系列请求和响应过程关联起来。

3)实现:需要浏览器对其发出的每个请求消息都进行标识。这个标识称为会话ID(SessionID)。

 

二、Cookie

一:存在两种类型的cookie:

1>会话cookie (session cookie)

       不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,   cookie就消失了。

       生命期为浏览器会话期。

       一般不保存在硬盘上而是保存在内存里。

2>持久性cookie (persistent cookies)

       设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。

       保存在用户硬盘上面,同一浏览器可以获取。

二: session相关知识

2.1: 什么是session?

       Session 是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过sessionid来区分不同的客户,session是以cookie或url重       写为基础.

2.2: session  的工作原理

client———>1.request————————->server

                       2. session_start();

   |<————-3.reponse(SESSION_ID)<——–|

|————->4.request(SESSION_ID)———>|

                       5. session_start();

   |<————-6.reponse(SESSION_ID)<———|

|————->7. request(SESSION_ID + logout)–>|

                      8. session_destroy();

   |<————-9. reponse(删除cookie文件)<——-|

client打开网页,向server发出请求,client上由于没有相应的cookie文件存在,在请求中不输送SESSION_ID

服务器在接受到client的请求后,通过执行session_start()函数开始进行session的处理, 首先确认请求中有没有SESSION_ID,如果没有的话,发行一个新的SESSION_ID;如果有的话, 则调用那个存有SESSION_ID的文件,并把信息写入$_SESSION里去,并存入以sess_开头的文件里。

把写入信息的$_SESSION参数发回给client,client在GET服务器发来的信息后,把这些信息保存在cookie里。

client把cookie里的SESSION_ID一起写入header后再次向server发出请求。重复1-3的操作

client发出登出请求

服务器接受请求后,通过执行session_destroy()函数开始删除session文件处理

服务器向client发出删除保存在client上的cookie文件的命令: setcookie(session_name(), ”, time()-60, ‘/’);

2.3: 注意

通常情况下是不能跨窗口使用,但用sessionid保存在持久cookie中,然后在从新窗口中读取,就可以得到sessionid,实现跨窗口的使用.

在大浏览量的网站,session并不保险,可能会出现重复的sessionid.

Session ID不能从硬盘上的Cookie文件获得,如果想在客户端获知自己的Session ID,只能通过Javascrīpt来读取。

2.4 php使用及设置

Session_start() :开始一个会话或者返回已经存在的会话。在使用Session_start()之前浏览器不能有任何输出,否则会发生以下错误。你可以在php.ini里 启动session.auto_start=1,这样就无需每次使用session之前都要调用session_start()。

如果在session.auto_start=1,会让session_save_path (‘./t/’);变的无效。因为后一条语句须放前面。

2.5 增加PHP的Session存储和处理能力

;session.save_path = “N;MODE;/path”  这项设置提供给我们可以给session存放目录进行多级散列,其中“N”表示要设置的目录级数,

“MODE”表示目录的权限属性,默认为600

2.6:多服务器共享php的SESSION

1、NFS或者Samba共享的方法,让各个服务器上存放session文件的磁盘共享,这种方法简单可行。

2、集中存储到数据库中,这是比较多的实现方法,通过php提供的session_set_save_handler()函数来重定义session函数,推荐使用这种方法。

三: cookie知识

什么是 Cookie?其工作原理如何?Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。用户每次访问站点时,Web 应用程序都可以读取 Cookie 包含的信息。 Cookie 的基本工作原理如果用户再次访问站点上的页面,当该用户输入 URLwww.*****.com时,浏览器就会在本地硬盘上查找与该 URL 相关联的 Cookie。如果该 Cookie 存在,浏览器就将它与页面请求一起发送到您的站点。Cookie 有哪些用途?最根本的用途是:Cookie 能够帮助 Web 站点保存有关访问者的信息。更概括地说,Cookie 是一种保持Web 应用程序连续性(即执行“状态管理”)的方法.使 Web 站点记住您.

1、客户端执行程序请求 服务器发回请求结果 并且生成一个cookie给客户端 所以 第二次刷新的时候 才会有cookie的出现
2、session是保存在内存中,跟进程是同时存在的会话cookie,但是此时服务器端还保存有session文件 需要设置时间来删除session文件
3、Cookie是在本地Cookie文件中保存一些信息,Cookie文件中保存的是键值对(key-value)。Cookie文件存放于你本地计算机系统盘的Document and Settings/用户名 目录下。如果你访问的网站的名称为www.abc.com,那么一般来说,Cookie文件的名称为 用户名@abc.com,你可以自己打开文件夹看一看。你提到的getName获得的是保存在Cookie文件中某一个Cookie的key值。

我们知道,session是在服务器端保持用户会话数据的一种方法,对应的cookie是在客户端保持用户数据。HTTP协议是一种无状态协议,服务器响应完之后就失去了与浏览器的联系,最早,Netscape将cookie引入浏览器,使得数据可以客户端跨页面交换,那么服务器是如何记住众多用户的会话数据呢?
首先要将客户端和服务器端建立一一联系,每个客户端都得有一个唯一标识,这样服务器才能识别出来。建议唯一标识的方法有两种:cookie或者通过GET方式指定。默认配置的PHP使用session的时会建立一个名叫”PHPSESSID”的cookie(可以通过php.ini修改session.name值指定),如果客户端禁用cookie,你也可以指定通过GET方式把session id传到服务器(修改php.ini中session.use_trans_sid等参数)。
我们查看服务器端session.save_path目录会发现很多类似sess_vv9lpgf0nmkurgvkba1vbvj915这样的文件,这个其实就是session id “vv9lpgf0nmkurgvkba1vbvj915〃对应的数据。真相就在这里,客户端将session id传递到服务器,服务器根据session id找到对应的文件,读取的时候对文件内容进行反序列化就得到session的值,保存的时候先序列化再写入。

三、HttpSession

1. 概念

1)含义:在Web开发环境中,session 是指一类用来在客户端与服务器之间保持状态的解决方案。有时候也用来指这种解决方案的存储结构。

2)机制:采用在服务器端保持HTTP状态信息。

3)原理:

  • 创建一个 session 时先检查这个客户端的请求里是否包含了一个 session 标识(即sessionID),即请求里是否存放了名为"JESESSIONID",值为 sessionID 的 cookie

  • 若已存在就检索出来使用,

  • 否则为此客户创建一个 session,并生成一个与此 session 相关联的 sessionID,用 set-cookie 方式传递给请求,那么下一次请求发出时,就会使用此 sessionID 作为 cookie 中名为"JESESSIONID"的值进行传递 sessionID。

4)保存方式:最常用的是用 cookie 保存。但如果 cokkie 被禁用,必须有其他机制进行保存。如URL重写:把 sessionID 附加在URL路径后面。

5)注意:由于是通常是用 cookie 来保存的,所以如果让 cookie 持久化就可以在重启浏览器后也能获取到该 sessionID。

//用持久化cookie保存sessionIDCookie cookie = new Cookie("JESESSIONID",session.getId());
cookie.setMaxAge(20);
response.addCookie(cookie);
Salin selepas log masuk

2. Session的创建

1) Session 属性

  • 若 page 指定的 Session 属性默认为 true,那么 第一次访问一个 WEB 应用的一个 JSP 页面时,该页面都必须有一个和这个请求相关联的 Session 对象。

  • 否则JSP 页面不会要求一定有一个 Session 对象和当前的 JSP 页面相关联,所以第一次访问JSP页面时不会创建一个 Session。

2)request.getSession(boolean flag):

  • true,则一定会返回一个 HttpSession 对象,如果已经有和当前 JSP 页面关联的 HttpSession对象,直接返回;如果没有,则创建一个新的返回。

  • false,则若没有和当前JSP页面关联的 HttpSession 对象返回null,否则返回取得的HttpSession对象。

  • request.getSession() 相当于 request.getSession(true)。

3. Session对象的销毁

1)调用HttpSession 的 invalidate()方法。

2)HttpSession 超过过期时间自动销毁,可以在 Tomcat 的 web.xml 文件中配置 Session 的最大时效, 单位是分钟。

<!-- apache-tomcat-x.x.xx\conf\web.xml --><session-config><session-timeout>30</session-timeout></session-config></p>
<p> </p>
<p><span style="color: #000000"><em>相关方法签名:</em></span></p>
<ul class=" list-paddingleft-2">
<li><p><span style="color: #000000">int getMaxInactiveInterval()                         //返回最大时效,单位:秒</span></p></li>
<li><p><span style="color: #000000">void setMaxInactiveInterval(int interval)      //设置最大时效</span></p></li>
</ul>
<p><span style="color: #000000">3)服务器卸载当前 WEB 应用。</span></p>
<p> </p>
<h2><span style="color: #000000">4.Session相关方法</span></h2>
<p><span style="color: #000000">String getId()                                                       //得到sessionID</span></p>
<p><span style="color: #000000">boolean isNew()                                                  //该session是不是新创建的<br></span></p>
<p><span style="color: #000000">long getCreationTime()                                       //该session被创建的时间<br></span></p>
<p><span style="color: #000000">long getLastAccessedTime()                              //该session最后一次被访问的时间</span></p>
<p><span style="color: #000000">void <span style="color: #ff0000">setAttribute</span>(String key, Object value)         //存放值,相当于哈希表<br></span></p>
<p><span style="color: #000000">Object <span style="color: #ff0000">getAttrbute</span>(String key)                           //根据键从session中取得对应的值</span></p>
<p> </p>
<h2><span style="color: #000000">5.URL重写实现Session跟踪</span></h2>
<p><span style="color: #000000"><em>方法签名:</em>String encodeURL(String url)  //该方法会在URL后面加上sessionID</span></p>
<div class="cnblogs_code"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">重新登录
Salin selepas log masuk
Salin selepas log masuk
重新登录
Salin selepas log masuk

 

Atas ialah kandungan terperinci cookie和session的会话和会话状态讲解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Cadangan popular
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan