• PHP Session原理


    众所周知,http协议是一个无状态协议,简单来说就是,web服务器是不知道现在连接上来的人到底是哪个人,为了满足选择性发送信息的需求,在http的基础上做了很多扩展来达到这个目的,如数字签名、cookie、session等。
    web服务器或者web程序如何能够知道现在连接上来的是谁?要解决这个问题,首先需要在服务器端和客户端建立一一对应关系,下边我通过抓取http的内容来说明这种对应关系是如何建立的。
    我使用的是一个叫做httplook的http包嗅探工具,然后在本地web服务器的根目录下建立一个叫test.php文件,地址是:http://localhost/test.php,一切就绪以后我通过浏览器反复打开这个页面。

    1. <?php
    2. session_start();
    3. if (isset($_SESSION['test_sess'])){
    4.     $_SESSION['test_sess']++;
    5. }else{
    6.     $_SESSION['test_sess'] = 0;
    7. }
    8. echo $_SESSION['test_sess'];
    9. ?>;


    以下是前两次向服务器发出的信息及服务器返回的信息


    QUOTE:
    原帖由 "第一次请求服务器" 发表:

    GET /test.php HTTP/1.1
    Accept: */*
    Referer: http://localhost/
    Accept-Language: zh-cn
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)
    Host: localhost
    Connection: Keep-Alive




    QUOTE:
    原帖由 "服务器第一次返回" 发表:

    HTTP/1.1 200 OK
    Date: Fri, 26 Aug 2005 07:44:22 GMT
    Server: Apache/2.0.54 (Win32) SVN/1.2.1 PHP/5.0.4 DAV/2
    X-Powered-By: PHP/5.0.4
    Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Content-Length: 1
    Keep-Alive: timeout=15, max=99
    Connection: Keep-Alive
    Content-Type: text/html; charset=utf-8
    Content-Language: Off




    QUOTE:
    原帖由 "第二次请求服务器" 发表:

    GET /test.php HTTP/1.1
    Accept: */*
    Referer: http://localhost/
    Accept-Language: zh-cn
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)
    Host: localhost
    Connection: Keep-Alive
    Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3




    QUOTE:
    原帖由 "服务器第二次返回" 发表:

    HTTP/1.1 200 OK
    Date: Fri, 26 Aug 2005 07:44:23 GMT
    Server: Apache/2.0.54 (Win32) SVN/1.2.1 PHP/5.0.4 DAV/2
    X-Powered-By: PHP/5.0.4
    Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Content-Length: 1
    Keep-Alive: timeout=15, max=98
    Connection: Keep-Alive
    Content-Type: text/html; charset=utf-8
    Content-Language: Off




    仔细对比这些输出,第二次请求比第一次请求多出来的就是:
    Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3
    这个header将会向服务器发送一个cookie信息,告诉服务器我有一个cookie,名字叫PHPSESSID,内容是bmmc3mfc94ncdr15ujitjogma3。
    这个cookie是怎么来的呢?看第一次服务器返回的信息里边有:
    Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/
    这是服务器向客户端浏览器写一个cookie,名字是PHPSESSID,值是bmmc3mfc94ncdr15ujitjogma3,这个值实际就是所谓的session_id。
    继续看第二次向服务器发出的请求,仍然向服务器发送了PHPSESSID这个cookie

    可以得到以下结论:
    1、只要使用了session,就会通过cookie的方式向客户端浏览器发送session
    2、每次向服务器发出请求的时候,本地浏览器会把cookie附带在请求信息中

    说到这里,服务器端和客户端如何通过session做到一一对应的答案就很清楚了,明白了这个道理,对于使用session有很大帮助,请细细体会。

    转:http://bbs.chinaunix.net/viewthread.php?tid=600493

  • 相关阅读:
    目录拷贝
    获取当前时间
    获取当前目录名称
    WPF 修改数据后更新UI
    外网访问FTP服务,解决只能以POST模式访问Filezilla的问题
    解决Postgresql服务启动又关闭的问题
    更换PostgreSql的data文件夹并重新服务器(此方法同样适用于系统崩溃后,找回数据的操作)
    C#一键显示及杀死占用端口号进程
    [WP8开发] WinJS中winControl或者itemDataSource值为null的解决方案
    [WP8开发] WebBrowser控件与后台代码.cs简单的交互
  • 原文地址:https://www.cnblogs.com/gaoxu387/p/2122515.html
Copyright © 2020-2023  润新知