`
xiaolongfeixiang
  • 浏览: 236802 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

操作Cookie的一个陷阱

阅读更多

全文总结:

 

在读取Cookie,然后操作时,除了getName(),getValue()外,不要妄图得到其他信息,如下方法不会得到值的:

cookie.getMaxAge();

cookie.getDomain();
。。。

因为,客户端传来的时候,就只剩下key和value了。

 

 

Java中的Cookie操作:

 

在Java中利用Serlvet或者JSP scriptlet可以向浏览器端写入Cookie。

 

同样,利用Servet或者JSP scriptlet 也可以读取到 Cookie信息。

 

Servlet规范中的Cookie API 如下:

 

setMaxAge  setPath setDomain等方法,可以对Cookie状态进行控制;

 

同样存在如下方法,可以获得相应的状态:

 

getMaxAge  getPath  getDomain等方法,可以对Cookie的状态。

 

 

然后,问题来了:

 

 

读取Cookie时,发现除了Cookie的key和value外,其他的信息都丢失了!!

 

原因很简单:

 

Cookie从服务器端发送到客户端时,信息是完整的;

 

Cookie从客户器端发送到服务端时,信息只剩下key、value了。

 

(想想也明白,Domain不对的Cookie、Path不对的Cookie、过期的Cookie,客户端是不会发送过来的。)

 

那为什么Java中提供了相应的get方法呢? 那个方法是在生成Cookie后,尚未发送到客户端时,使用的。是“封装”的体现吧  O(∩_∩)O~

 

案例说话:

 

写入Cookie的Servlet

package edu.xjtu.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AddCookie extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		Cookie cookie01 = new Cookie("site","JavaEye");
		cookie01.setMaxAge(60*60*1);
		cookie01.setPath("/");
		Cookie cookie02 = new Cookie("name","xiaolongfeixiang");
		cookie02.setMaxAge(60*60*2);
		cookie02.setPath("/servlet");
		
		
		response.addCookie(cookie01);
		response.addCookie(cookie02);
		
		response.setContentType("text/html;charset=UTF8");
		PrintWriter out = response.getWriter();
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.println("  cookie写入了");
		out.println(" <a href='show'> 查看cookie </a>");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

}
 

 

读取Cookie的Servlet

package edu.xjtu.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ShowCookie extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		Cookie[] cookies = request.getCookies();
		
		StringBuffer buffer = new StringBuffer();
		
		for(Cookie cookie : cookies){
			buffer.append(cookie.getName()).append(" : ").append(cookie.getValue());
			buffer.append(" -- ").append(" MaxAge : "+cookie.getMaxAge());
			buffer.append(" -- ").append(" Path : "+cookie.getPath()).append("<br/>");
		}
		
		response.setContentType("text/html;charset=UTF8");
		PrintWriter out = response.getWriter();
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.println("  读取的Cookie:<br>");
		out.println(buffer.toString());
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
		
	}

}
 

 

写入Cookie的页面


 

Response的信息如下:(信息齐全!!)


 

 

查看Cookie的页面:(发现结果丢了一部分:)


 

看浏览器的Cookie

 

Cookie: name 属性都对着的


 

Cookie: site 属性也都对着的


 

 

再看看网络:(发现传过来的Cookie都只有key-value了。所以那些状态信息都丢失了!!)

 


 

 

验证了前面的总结:


在读取Cookie然后操作时,除了getName(),getValue()外,不要妄图得到其他信息,如下方法不会得到值的:

cookie.getMaxAge();

cookie.getDomain();
。。。

因为,客户端传来的时候,就只剩下key和value了。
 

 

感谢rentianchou,在解决他(她)提出的问题时,我做了这个实验!!谢谢rentianchou

 

  • 大小: 6.7 KB
  • 大小: 5 KB
  • 大小: 15.4 KB
  • 大小: 4.8 KB
  • 大小: 15.6 KB
  • 大小: 15.7 KB
12
3
分享到:
评论
4 楼 jasonsun1985 2011-05-26  
正在研究这块东西,发现受益匪浅,谢谢了!
3 楼 xiaolongfeixiang 2010-04-30  
rentianchou 写道
xiaolongfeixiang  非常感谢你热心的回答哦  

呵呵,能给予别人一点帮助,我很高兴。因为,我也尝试过无助的痛苦,呵呵
2 楼 rentianchou 2010-04-30  
xiaolongfeixiang  非常感谢你热心的回答哦  
1 楼 xiaolongfeixiang 2010-04-30  
被人踩也是一种福气,O(∩_∩)O~

虽说本文写的不是很深入,但是图文的方式,将平时容易忽略的一点给指了出来。呵呵,继续努力,争取写出好文章!!

相关推荐

    jQuery Cookie (内附 上百行的中文使用手册,与 所有的注释中文翻译)

    jQuery Cookie是jQuery的一个插件,为开发者提供了方便、简洁的API来操作Cookie,无需处理复杂的原生JavaScript API。这个压缩包包含了一个中文版的使用手册和对源代码的详细注释,对于学习和使用jQuery Cookie非常...

    利用Python的requests实现SCU的登录获取Cookie

    在下载验证码图片后,还需要注意到获取验证码时的一个陷阱:请求中包含了随机数以防止缓存,所以我们需要在URL末尾添加一个随机值。 ```python import random captcha_url = soup.find("img", id="captchaImg")['...

    Php安全新闻早8点

    - **登录验证中的Cookie操作:** 在用户登录后,通常会通过设置Cookie来记录用户的登录状态。示例代码如下: ```php if ($adminuser == $user && $adminpass == $pass) { setcookie("login", "yes", time() + ...

    python 常见的反爬虫策略

    网页中设置一些陷阱(正常用户访问不到但是爬虫可以访问到) 解决办法:分析网页,避开这些特殊陷阱 请求间隔太短,返回相同的数据 解决办法:增加请求间隔 3、js加密 反爬方式中较为难处理的一类。 js加密的原理:...

    最新前端面试题

    6. 线程和进程的区别是线程是最小的执行单元,进程是最小的资源管理单元,一个线程只能属于一个进程,而一个进程可以有多个线程。 7. 服务器集群负载均衡原理是使用增加服务器数量来进行横向扩展,使用集群和负载...

    前端安全概览及防范

    在Yupoo的案例中,攻击者利用一处XSS漏洞,构造了一个能够读取用户Cookie的恶意脚本。通过JavaScript和PHP的结合,攻击者不仅获取了用户的Cookie信息,还成功地进行了Cookie伪造,实现了对用户账户的非法访问。 **...

    jsp+javascript收集

    4. "有关 JavaScript 的 10 件让人费解的事情 - CSDN资讯.mht":这是一个关于JavaScript中的一些常见陷阱和不寻常特性的文章,可以帮助开发者避免常见错误,提高编程技巧。 5. "引用js大全.txt"、"JS.txt"、"js分页...

    JavaScript王者归来part.1 总数2

     11.3.2.1 模拟对话框--创建一个窗口对话框及一个对话框阻塞进行的例子   11.3.2.2 showModalDialog和showModelessDialog--非W3C或ECMAScrip标准   11.3.3 状态栏   11.4 框架--上层的Window对象   11.4.1 ...

    投票调查功能的ASP例

    总的来说,"投票调查功能的ASP例"涉及了ASP基础、数据库操作、用户交互以及Web开发的多个方面,是学习ASP动态网站开发的一个典型应用场景。通过这个实例,开发者可以深入理解如何在实际项目中运用ASP技术,构建功能...

    AutoLogon_fake_源码.zip

    3. 自动登录实现:这部分代码将处理自动登录的逻辑,比如保存用户的凭据以便下次自动填充,以及在用户设备上设置cookie或本地存储以标识已登录状态。 4. 安全措施:由于“fake”一词,源码可能包含了对不安全自动...

    爬虫守则1

    3. **处理Spider Traps**:爬虫陷阱是指网站设计用来捕获爬虫的机制,如动态URL、无限循环链接等。应对策略包括: - 对于动态URL,可尝试识别并统一处理。 - 遇到循环链接时,设定循环检测阈值,超过阈值则停止...

    如何做输入密码正确,在下载

    例如,`$lifeTime = 2 * 3600`表示2小时,`setcookie()`函数用于设置cookie,确保session ID在客户端有效。接着,我们将预设的密码(在这个例子中是`'fsdbkitchen2014'`)存储到`$_SESSION['downloadpwd']`中。 3. ...

    ASP网站实例开发源码——古典风格漂亮实用的茶叶公司网站(源码+数据库).zip

    这个压缩包提供的是一个以ASP技术构建的茶叶公司网站的实例开发源码,结合了古典风格的设计和实际的功能,旨在帮助学习者理解如何用ASP来创建一个具有商业价值的网站。 该网站实例主要包含以下几个方面的知识点: ...

    php和序设计 不错的学习

    - **Cookie**:理解Cookie的概念,学会如何设置和读取Cookie,实现简单的用户登录状态保存。 #### 四、数据库操作 - **关系型数据库**:介绍如何使用PHP与MySQL或Oracle等关系型数据库进行交互,包括连接数据库、...

    JS学习总结

    然而,示例代码中展示了变量作用域的一个常见陷阱:全局变量与局部变量的混淆。例如,在函数`test()`外部声明的`var goal = 1;`在函数内部未被重新声明,导致函数内部可以直接访问并可能修改这个全局变量。这在实际...

    PHP中文参考.zip

    PHP是免费的,而且拥有一个活跃的社区,这使得开发者能够获取丰富的资源和支持。 这个“PHP中文参考手册”是一个非常实用的工具,对于学习和精通PHP编程至关重要。CHM(Compiled Help Manual)格式是一种由微软开发...

    LuBei-Summary-HTML_meta_http-equiv.rar_The Mass

    `http-equiv`是一个特殊的指令,它允许网页模拟HTTP头部信息,对页面的行为进行控制。在描述中提到的“code mass questions”可能是指大量关于如何正确使用`http-equiv`的代码问题或挑战。 在HTML中,`&lt;meta&gt;`标签...

    汇总PHP编程注意事项.doc

    同样,在例2中,`isset()` 和连接符 `.` 的优先级关系导致了一个未定义索引的错误。理解这些优先级对于避免运行时错误至关重要。 2. **大小写敏感性**: PHP中函数名和类名是不区分大小写的,但变量名是区分大小写...

    基于Python的网络爬虫与反爬虫技术的研究.pdf

    数据的存储也是网络爬虫程序开发过程中的一个重要环节。本研究中选择将爬取的数据保存在MySQL数据库中。MySQL是一种关系型数据库管理系统,它通过结构化查询语言SQL来管理和操纵数据。在存入数据之前,需要先建立...

    JAVA WEB 认证题库

    一个Servlet可以与多个过滤器关联,一个过滤器也可以被多个Servlet使用,但并非每个Servlet都必须有至少一个过滤器,同样,并非每个过滤器都必须部署到至少一个Servlet。正确答案是A. 可以为一个Servlet部署多个过滤...

Global site tag (gtag.js) - Google Analytics