`
jishublog
  • 浏览: 870663 次
文章分类
社区版块
存档分类
最新评论

Cookie 路径在本机测试及服务器部署,在浏览器处理方式上的不同

 
阅读更多


1问题场景

最近在学用Python进行web开发,写了一个博客系统,基本的配置如下:

  • 开发语言: Python + javascript
  • 开发框架: Web.py
  • 服务器: virtualbox + centos6.3 + nginx + fastcgi

在本机测试时,完全没有问题,可是部署到服务器上后,发现用户登录后,服务器端设置了cookie, 但是后面需要读 这个cookie时,却读取不到。 这里的读写cookie使用的是Web.py中提供的:

// 设置cookie
web.setcookie ('username', 'tom')

// 读取cookie
web.cookies.get('username')


2解决过程

解决问题真的需要好的思路,就像在设计一个实验,不断地猜测,实验验证,最后得出结论,特别是这种问题你根本 就Google不到,并且你根本不知道到底是哪里出了问题,是客户端,还是服务器,是你写的程序本身出错了,还是框架 本身的代码有问题。

2.1cookie是否设置成功

对于这个问题, 我们首先要判断cookie是没有设置成功,还是设置成功了,但是客户端没有传上来。 这一点可以通过用户登录后,在客户端查看cookie的方式来验证,我使用的是chrome,可以使用setting->advanced settings ->Privacy->Content setting->All cookies and site data来查看,通过搜索可以看到指定站点的cookie.在这里可以 看到cookie确实设置成功了。

2.2cookie是否上传到服务器

既然cookie已经在客户端出现,到底是客户端上传到服务器了,服务器没有接收到,还是客户端就没有给服务器上传cookie呢。 这一步可以使用chrome的调试工具,通过查看请求的header确定。具体方法是右击打开Inspect Element, 选择Network,然后 刷新页面,向服务器发请求,这时候,Network部分就会出现这次请求的相关信息,点击左栏出现的项,就可以看到Headers信息, 包括 Request Headers 和 Response Headers, 这里可以发现 Request Headers中没有包含cookie项。

这就很奇怪,客户端有cookie,为什么向服务器发请求时没有携带这个cookie呢?既然客户端的处理不正确,那么为什么在本 机测试时没有问题,部署到服务器后却有了问题呢?为了确定两种方式的不同,我又做对比实验,仔细观察了这两种方式 在客户端设置的cookie, 发现本机测试时cookie的路径是根路径 "/", 而部署到服务器后,cookie的路径却是 "/wpusers/tom/", 注意两次请求的路径一样,都是"192.168.xxx.xxx:/wpusers/tom", 我意识到问题可能 出现在这里,然后就再做实验,在setcookie时,指定路径为 "/", 这一次工作就正常了。看来真的是路径问题。

问题本身已经解决了,但是我们要问,为什么cookie的路径是 "/wpusers/tom/" 就不行呢,总不能所有cookie路径 都是根路径吧。根据以前的经验,有没有 "/",结果是完全不同的,我试探性地将 "/wpusers/tom//" 改成了  "/wpusers/tom", 发现这次居然可以了。原来浏览器访问"192.168.xxx.xxx:/wpusers/tom" 时会携带路径为 "/wpusers/tom" 的cookie, 而不携带 "/wpusers/tom/", 历史再次证明了,有没有"/", 差别是很大的。因为这个问题,我还发现了 另一个问题,就是不同浏览器对此的处理是不同的。我重复了很多次实验,发现chrome和opera的处理方式如上述所示,对有 没有"/"区别很大,而firefox不同,在访问"192.168.xxx.xxx:/wpusers/tom"时,路径是"/wpusers/tom/"的cookie也会 被一起上传。

下面的两张图分别是chrom 和firefox第一次发起请求时的headers, 注意看两者Response headers部分的Set cookie, 这是第一次请求时

服务器给浏览器发来的cookie, path字段都是"/wpusers/tom/"



图1 chrome 第1次请求



图2 firefox 第一次请求


下面我们看第二次请求,这一次注意看两者的request headers部分有没有携带cookie, chrome没有,而firefox 有。(另外,为了实验的方便服务器端setcookie是在请求/wpusers/tom时发生的,所以在response段每次都可以看到Set-cookie字段,但是这不重要,重要的是浏览器在第二次发起请求时,request headers部分是否有cookie字段)



图3 chrome 第二次请求



图4 firefox 第二次请求



还有一个问题,就是最一开始调用setcookie时,我并没有使用path这个参数,路径是被自动设置为"/wpusers/tom/"的, 最后的"/"就是罪魁祸首,为什么会自动设置成这样呢, 我查看了Web.py在Github上的源代码。

webpy/web/webapi.py 中,在setcookie函数中是这样设置路径的。

morsel['path'] = path or ctx.homepath+'/'

意思就是说如果有path路径,我们按path来,没有path路径我们就设置成 ctx.homepath+'/', 问题就出现在这个 ctx.homepath+'/'上,本意是ctx.homepath为空时,设置成根路径,这应该就是本机测试时的情况。而如果访问的是 "/wpusers/tom", 路径就被设置成了 "/wpusers/tom/", 这就会让chrome和opera在读取cookie时出错。问题的 最终原因终于找到,开源软件就是好呀,就是好来就是好~

3总结

表面原因是cookie的路径设置出的问题

根本原因在于源代码中对path的路径处理出了问题


分享到:
评论

相关推荐

    cookies-sharing-extension:该工具包包括带有扩展名的源代码和一个包含安全cookie的部署存储服务器。

    从导出Cookie的时间起24小时后,该Cookie路径将被删除(根据开发人员的意愿设置时间,默认情况下为24小时)。 使用的技术: 扩展名:HTML,布尔玛,Javascript 服务:NodeJS,Express,Firebase 如何使用: ...

    Google Android SDK开发范例大全(第3版) 1/5

    6.9 访问本机内存与存储卡 6.10 实现可定时响起的闹钟 6.11 黑名单来电自动静音 6.12 手机翻背面即静音振动 6.13 指定时间置换桌面背景 6.14 判断发送短信后的状态 6.15 后台服务送出广播信息 6.16 开机程序设计 ...

    Google Android SDK开发范例大全(第3版) 4/5

    6.9 访问本机内存与存储卡 6.10 实现可定时响起的闹钟 6.11 黑名单来电自动静音 6.12 手机翻背面即静音振动 6.13 指定时间置换桌面背景 6.14 判断发送短信后的状态 6.15 后台服务送出广播信息 6.16 开机程序设计 ...

    Google Android SDK开发范例大全(第3版) 3/5

    6.9 访问本机内存与存储卡 6.10 实现可定时响起的闹钟 6.11 黑名单来电自动静音 6.12 手机翻背面即静音振动 6.13 指定时间置换桌面背景 6.14 判断发送短信后的状态 6.15 后台服务送出广播信息 6.16 开机程序设计 ...

    Google Android SDK开发范例大全(第3版) 5/5

    6.9 访问本机内存与存储卡 6.10 实现可定时响起的闹钟 6.11 黑名单来电自动静音 6.12 手机翻背面即静音振动 6.13 指定时间置换桌面背景 6.14 判断发送短信后的状态 6.15 后台服务送出广播信息 6.16 开机程序设计 ...

    Google Android SDK开发范例大全(第3版)part2

     6.9 访问本机内存与存储卡  6.10 实现可定时响起的闹钟  6.11 黑名单来电自动静音  6.12 手机翻背面即静音振动  6.13 指定时间置换桌面背景  6.14 判断发送短信后的状态  6.15 后台服务送出广播信息 ...

    《Google Android SDK开发范例大全(第3版)》.pdf

    6.9 访问本机内存与存储卡 329 6.10 实现可定时响起的闹钟 335 6.11 黑名单来电自动静音 340 6.12 手机翻背面即静音振动 343 6.13 指定时间置换桌面背景 349 6.14 判断发送短信后的状态 357 6.15...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    手动优化了PDF的书签,书签可折叠,书签链接以目录方式保存,多达1000多页,每页都做了书签定位,手都累酸啦。 ============================== 因权限只能到60MB,分卷压缩了,共3个压缩包,需下载完3个一起解压, ...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    ● 服务器控件的概念及其在ASP.NET开发中的主导作用 ● 使用新的Master页面特性创建模板化的ASP.NET页面 ● 调试和处理错误的技术 ● 提取、创建、处理和存储XML的各种框架 ● 打包和部署ASP.NET应用程序的方法 ...

    ASP.NET2.0高级编程(第4版)1/6

    21.4.1 处理页面上的异常735 21.4.2 处理应用程序异常736 21.4.3 HTTP状态码737 21.5 小结738 第22章 文件I/O和流739 22.1 使用驱动器、目录和文件739 22.1.1 DriveInfo类739 22.1.2 Directory和  DirectoryInfo类...

    superdaxue:超级大学手机查级成绩全部源码,支持微信公众号,qq公众号,微博,手机浏览器等所有浏览器环境,第一次保存密码到cookie,往后无需输入体验地址:

    超级大学查成绩查课表系统超级大学是一种为高校公众号运营提供教务,社交... 青果教务系统不能在阿里云上正常工作3. 数据库字符集:utf8 -- UTF-8 Unicode,排序规则:utf8_general_ci其他更多功能:##二手交易匿名评教

    ASP.NET4高级程序设计(第4版) 3/3

    4.2.7 处理服务器端事件 104 4.3 Web控件 107 4.3.1 WebControl基类 107 4.3.2 基本的Web控件类 108 4.3.3 单位 109 4.3.4 枚举 110 4.3.5 颜色 110 4.3.6 字体 111 4.3.7 焦点 12 4.3.8 默认...

    SSO CAS 单点登录实例SSOAuth+SSOWebDemo1+SSOWebDemo2.zip

    这三个Web应用完全可以单独部署,它们可以分别部署在 不同的机器,不同的操作系统和不同的J2EE的产品上,它们完全是标准的和平台无关的应用。但是有一个限制,那两台部署应用(demo1、demo2)的 机器的域名需要相同...

    fourinone-3.04.25

    没有单点问题,可以有任意多个复本,它的复制不是定时而是基于内容变更复制,有更高的性能,Fourinone实现了领导者选举算法(但不是Paxos),在领导者服务器宕机情况下,会自动不延时的将请求切换到备份服务器上,...

    ASP.NET.4揭秘 卷2

    n244 在浏览器cookie中缓存角色 n245 使用Roles API n25 小结n第二部分nbsp 创建ASPNET应用程序 n第3章 维护应用程序状态 n31 使用浏览器cookie n311 cookie的安全性限制 n312 创建cookie n313 读取cookie n314 设置...

    超级有影响力霸气的Java面试题大全文档

    当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例...

    Fourinone分布式并行计算四合一框架

    没有单点问题,可以有任意多个复本,它的复制不是定时而是基于内容变更复制,有更高的性能,Fourinone实现了领导者选举算法(但不是Paxos),在领导者服务器宕机情况下,会自动不延时的将请求切换到备份服务器上,...

    IBM WebSphere Portal门户开发笔记01

    2、本机域名映射 44 五、WCM几个页面路径及其名称 44 1、登录页面 44 2、主题及主页页面 45 3、皮肤外观页面路径 45 4、session超时页面 45 5、登录portal时,绕过登录界面,直接进入到主页(或再登录) 45 6、...

Global site tag (gtag.js) - Google Analytics