拿sessionID举例, 其媒介是通过cookie这种key-value标识(实现用户身份认证)在浏览器和服务器间进行传递,从而实现浏览器和服务器的`持续通讯`
cookie的主要属性:
path:cookie的作用域 如:'/'表示当前域名的所有url下,均可访问到该cookie
domain:cookie域[由服务器返回,浏览器端存储]
expire:cookie的过期时间
<?php
//cookie跨域问题讨论
//关于sessionID, 媒介:通过cookie这种key-value标识(实现用户身份认证)在浏览器和服务器间进行传递,从而实现通讯,
// cookie的主要属性:
// path:cookie的作用域 如:'/'表示当前域名的所有url下,均可访问到该cookie
// domain:cookie域[由服务器返回,浏览器端存储]
// expire:cookie的过期时间
/** 测试说明
* 主机域名为www.caibird.top 而http头设置的cookie域名为www.weibo.com
*/
//测试场景:
// case 1: 在初次访问时打开flag-a, 二次访问关闭
// case 2: 在初次访问时关闭flag-a, 二次访问打开
//测试一 通过设置cookie的domain域, 观察浏览器端如何响应
#flag-a
// ini_set('session.cookie_domain', 'weibo.com');
#flag-a
session_start();
$timestamp = time();
if (!isset($_SESSION['hope'])) {
$_SESSION['hope'] = $timestamp . ': hope for you!';
}
//测试结论
// case 1: 初次访问该网页时,浏览器并没有存储sessionID,原因(猜测)是访问域名与cookie域名的domain属性值不等时,浏览器会拒绝存储该cookie, 但是在(flag-a注释关闭)之后二次访问时, 服务器又会与浏览器成功建立的会话[使用cookie在服务器与浏览器之间建立可持续通讯(不是网络上的tcp断开和tcp连接)]
// case 2: 服务器与浏览器间的会话成功建立[cookie成功保存在浏览器端], 之后再(flag-a注释打开), 发现保存的cookie并没有消失, 原因是因为sessionID这个cookie的expire属性为"session"(即浏览器关闭后, sessionID会丢失, 即该cookie是存在内存中并而非存到磁盘上)
//结论:
// 只要认清cookie的本质及其属性,理解浏览器和服务器的会话机制, 再充分认识cookie在浏览器端的存储机制, 就能较好的实现浏览器与服务器间的`通讯`;
// 且在某一层面上, 浏览器本身就支持跨域这种行为, 且考虑到网页使用安全, 浏览器支持安全策略-“同源策略”, 也不允许访问不同源(不同域名)下的资源。
//附赠:其他测试方法, 观察浏览器端是否有存储相关cookie, 及其path, expire等属性
// 通过setcookie方式
setcookie('where', 'hello kiti', time()+60, '/', '.caibird.top');
setcookie('come', 'here', time()+60, '/', '.caibird.top');
setcookie('zore', 'here', time()+60, '/', '.weibo.com');
echo json_encode($_SESSION); //打印会话<?php
测试结论
case 1: 初次访问该网页时,浏览器并没有存储sessionID,原因是访问域名与cookie域名的domain属性值不匹配, 浏览器会拒绝存储该cookie, 但是在(flag-a注释关闭)之后二次访问时, 服务器又会与浏览器成功建立的会话[使用cookie在服务器与浏览器之间建立可持续通讯(不是网络上的tcp断开和tcp连接)]
case 2: 服务器与浏览器间的会话成功建立[cookie成功保存在浏览器端], 之后再(flag-a注释打开), 发现保存的cookie并没有消失, 原因是因为sessionID这个cookie的expire属性为"session"(即浏览器关闭后, sessionID会丢失, 即该cookie是存在内存中并而非存到磁盘上)
结论:
只要认清cookie的本质及其属性,理解浏览器和服务器的会话机制, 再充分认识cookie在浏览器端的存储机制, 就能较好的实现浏览器与服务器间的`通讯`;
且在某一层面上, 浏览器本身就支持跨域这种行为, 且考虑到网页使用安全, 浏览器支持安全策略-“同源策略”, 也不允许访问不同源(不同域名)下的资源。
那么有人会问:是不是只要cookie的domain设置的和访问主机的域名一致,是不是就可以了(这个我还没尝试),浏览器端的同源策略校验可没那么简单(我是这么想的)?或者说cookie的domain其实就是多余的(域名有分级)只需校验是不是同源就行啦还有很多手段的嘛,只能说cookie的domain属性的存在是必要的(相信大师)。
不可轻易陷入细节的泥潭,不过咱们可以一起学习讨论。