php session与cookie的一些认识

来源:互联网 发布:熊猫智能采集软件 编辑:程序博客网 时间:2024/05/22 07:02

php 中关于 session 与cookie的理解 以及一些跨域问题

关于session与cookie 我在之前的工作中就一直接触并使用,但是一般是一些简单的认识 如果有人问我它们之间的区别,我就说 session存在服务端,cookie 存在客户端 浏览器每次打开一个窗口就会产生新的会话 php中有设置setcookie() 函数 可以设置cookie。最近由于公司做一个项目 涉及前后端分离,以及一些跨域问题。这让我对session 与cookie有更深的认识一般来讲 b/s架构 (浏览器/server),当 浏览器第一次访问(http)服务端时,这边我指的是PHP 做服务端。这时就产生一个http请求,通过浏览器调试工具可以看到一些请求信息 如图

这里写图片描述

General (通用头)
Request URL:http://www.xxx.com/bossapi.php?c=Index&a=main
Request Method:GET
Status Code:200 OK 响应状态码 可以参考 http状态码
Remote Address:139.224.135.105:80
Referrer Policy:no-referrer-when-downgrade

Request Headers(请求头)
Accept:application/json, text/plain, /
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
Content-Type:application/x-www-form-urlencoded;charset=utf-8
Cookie:CNZZDATA1263664992=454945981-1505559367-%7C1505559367;
Host:testcrm.xiaoma.wang
Origin:http://www.xxx.com
Referer:http://www.xxx.com/aa/
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36

Response Headers
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:Origin, X-Requested-With, Content-Type , Accept , Set-Cookie , Cookie
Access-Control-Allow-Origin:http://www.xxx.com
Cache-Control:no-store, no-cache, must-revalidate
Content-Length:48
Content-Type:application/json; charset=utf-8
Date:Thu, 28 Sep 2017 12:38:19 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive:timeout=38
Pragma:no-cache
Server:Apache/2.4.7 (Ubuntu)
Set-Cookie:PHPSESSID=p5mdtpj739m2ve8chr2lipti14; expires=Thu, 28-Sep-2017 16:42:33 GMT; Max-Age=14400; path=/

第一次链接时,比如这是一个登录页面的请求,发送到PHP后端时 php后端代码上启用了session_start(),操作了$_SESSION,由于php这边找不到该请求的对象,会设置一PHPSESSID 表明 $_SESSION是属于谁来使用的  这样来讲 假如 有A,B,C 三个用户访问 后端Servere 每个用户都会去操作$_SESSION 这个时候怎么判断是 $_SESSION是谁的呢,当然有PHPSESSID来区别 ,A,B,C来访问Server时 ABC都会赋予一个唯一的PHPSESSID存储到Cookie中,每当下一次请求时Cookie都会带上这个PHPSESSID来去找对应$_SESSION  将用户的信息存储到session中显然更加安全;expires这个指的时过期时间,Max-Age最生存时间 14400秒现在还没遇到跨域问题,都是在同一个域名下还好。如果在跨域下 seesion cookie跨域解决办法
    $.ajax({   url: a_cross_domain_url,   //XHR对象的withCredentials设为true   xhrFields:{      withCredentials:true   }});

同时服务器端还需要设置 Access-Control-Allow-Credentials 为true。

注意,这里fromeDomain.com 不能设置为 * 来允许全部,如果在 Credentials 是true 的情况下。因为浏览器会报错如下:
A wildcard ‘*’ cannot be used in the ‘Access-Control-Allow-Origin’ header when the credentials flag is true. Origin ‘http://xxxxxxxxxx’ is therefore not allowed access

所以只能乖乖的设置成客户端页面的 域名。

有一点需要注意,设置了widthCredentials为true的请求中会包含远程域的所有cookie,但这些cookie仍然遵循同源策略,所以你是访问不了这些cookie的。

是当提交一个请求到异域时,后台尝试在响应中绑定cookie信息,以告知浏览器去保存这个cookie,但是默认情况下,浏览器是不会去为你创建cookie的,具体现象就是你发现在响应中已经有set-cookie的响应头了并且有值,而且浏览器也会有信息显示已接收到cookie了,但是就是在cookie中找不到。没错,该现象就是因为你是跨域提交的创建cookie的请求。那么如果我们非要浏览器去创建这个cookie怎么办呢?这里就要使用到一个xmlHttpRequest对象的属性xhrFields,官方文档的解释如下:

A map of fieldName-fieldValue pairs to set on the native XHR object. For example, you can use it to setwithCredentials to true for cross-domain requests if needed.
设置了withCredentials:true 之后可以解决一个发送,一个设置的问题

1、允许创建来自不同域的cookie信息;2、每次的跨域请求都允许带上该cookie信息

参考文章

http://www.cnblogs.com/btgyoyo/p/6219516.html