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.1 cookie是否设置成功
对于这个问题, 我们首先要判断cookie是没有设置成功,还是设置成功了,但是客户端没有传上来。 这一点可以通过用户登录后,在客户端查看cookie的方式来验证,我使用的是chrome,可以使用setting->advanced settings ->Privacy->Content setting->All cookies and site data来查看,通过搜索可以看到指定站点的cookie.在这里可以 看到cookie确实设置成功了。
2.2 cookie是否上传到服务器
既然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时出错。问题的 最终原因终于找到,开源软件就是好呀,就是好来就是好~
相关推荐
当用户首次访问一个网站时,服务器可能会在用户浏览器上设置一个Cookie。这个Cookie包含一个唯一的标识符,有时也会包含过期时间、域、路径等信息。每当用户再次访问该网站,浏览器会自动将该Cookie的值发送回服务器...
Servlet 是 Java Servlet API 的实现,它是基于 Java 的服务器端程序,运行在 Web 服务器或应用服务器上,用于处理和响应来自客户端(如浏览器)的请求。Servlet 生命周期包括加载、初始化、服务、销毁四个阶段。...
Cookie是由服务器发送到客户端(浏览器)的一小段信息,客户端在后续请求时会自动将Cookie回传给服务器,从而实现状态的保持。在这个“cookie实现记住用户名密码”的项目中,我们主要会涉及到Java Web开发环境,如...
这篇教程将深入探讨在IIS(Internet Information Services)和Apache两种不同的Web服务器环境下,如何使用JavaScript来操作Cookie。 **一、Cookie的基本概念** Cookie是由服务器端创建,并发送到客户端浏览器的一...
- **Session测试**:防止Session劫持和伪造,确保客户端和服务器之间的通信安全,定期刷新Session ID,同时考虑Session存储的位置和方式。 - **跨站脚本(XSS)漏洞测试**:XSS攻击通过注入可执行代码,影响用户...
2. 不利于分布式部署:Session数据通常绑定在单台服务器上,不便于在多台服务器之间共享。 在实际应用中,通常会结合Cookie和Session使用,比如使用Cookie存储Session ID,而服务器端的Session存储用户详细信息。...
Cookie是Web服务器发送到客户端(浏览器)的一小块数据,用于在客户端存储状态信息。它通过HTTP头字段在服务器和客户端之间传递。 1. **Cookie的创建** - 使用`HttpServletResponse`的`addCookie()`方法创建Cookie...
- **兼容性测试**:确保Web应用能在不同的浏览器(如Chrome、Firefox、Safari)和操作系统上正确显示。 ##### 2. 性能测试 性能测试用于评估Web应用在各种负载条件下的响应时间和资源使用情况。 - **负载测试**:...
7. 测试运行:在浏览器中输入服务器地址,测试游戏是否正常运行。 【可能出现的问题】 在安装和部署过程中可能会遇到以下问题: 1. 版本兼容性:确保本地开发环境和服务器支持的JavaScript版本与源码所依赖的版本...
- 通过浏览器访问页面,测试购物车功能。 ##### 开发一个简单的用户登录提示系统 1. **编写HTML页面** - 创建一个HTML页面(UserLogin.html),用于收集用户名和密码。 - 添加表单元素,如文本框和按钮。 2. *...
如果服务器部署了多个应用,可以通过URL路径来区分,如`http://localhost:8080/myapp`。 在Java Web服务器的开发过程中,通常会涉及以下概念和技术: 1. **MVC(Model-View-Controller)**:一种软件设计模式,用于...
持久cookie以文件形式存储在客户端的硬盘中,有特定的生命周期,而会话cookie则存储在浏览器内存中,浏览器关闭即失效。因此,Kisso可以灵活地应对不同的安全和持久性需求。 在安全性方面,Kisso的cookie采用各种...
### ASP 获取服务器信息详解 在ASP (Active Server Pages) 的应用开发...以上列出的环境变量是ASP开发者在处理服务器端逻辑时非常有用的信息来源。通过对这些信息的合理利用,可以实现更强大的功能和更好的用户体验。
本章主要围绕Servlet进行深入探讨,包括Servlet的基础知识、编程接口以及如何在Tomcat服务器上进行配置和部署。 首先,Servlet是Java平台上的一个核心组件,它扩展了Web服务器的功能,允许开发者用Java代码来处理...
首先,当一个用户在一台客户端登录后,服务器会在该用户的浏览器中,通过cookie的形式设置一个唯一的标识ID。这个ID将作为一个标记,用来识别用户的登录状态。具体来说,cookie是一个存储在用户浏览器中的小文本文件...
在浏览器中输入服务器的公网IP地址和端口号进行测试,确认Tomcat是否正确运行。 ### 防火墙配置 防火墙配置通常用于Linux系统的安全管理,通过firewalld服务来管理。在本例中,需要开放8080和8009端口,这些端口...
2. **Cookie更新不正确**:服务器在处理登录请求时没有正确地更新或设置Cookie。 3. **浏览器缓存**:浏览器可能缓存了旧的Cookie,导致新登录后未显示更新的Cookie。 4. **框架或库的配置问题**:使用的Web框架或库...
使用JMeter进行性能测试之前,需要先进行环境部署,包括安装JMeter、配置JDK环境变量,以及确保JDK路径和JMeter路径没有中文和空格,以免出现异常。JMeter可以从官方网站下载最新版本,并解压到任意目录。在安装JDK...
开发者通常会在Tomcat上部署和测试他们的应用。 3. **HTML(超文本标记语言)**:HTML是用于创建网页的标准标记语言,它定义了网页的结构和内容。在JavaWeb中,HTML常作为用户界面的一部分,通过服务器端的动态处理...