`

转:操作Cookie的一个陷阱

    博客分类:
  • web
 
阅读更多

最近小研究了一下cookie,发现有人已经总结好了,我就懒得自己写了。转载一下,感谢作者:

原文地址:http://xiaolongfeixiang.iteye.com/blog/656454

全文总结:

 

在读取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

Java代码 复制代码 收藏代码
  1. package edu.xjtu.servlet;   
  2.   
  3. import java.io.IOException;   
  4. import java.io.PrintWriter;   
  5.   
  6. import javax.servlet.ServletException;   
  7. import javax.servlet.http.Cookie;   
  8. import javax.servlet.http.HttpServlet;   
  9. import javax.servlet.http.HttpServletRequest;   
  10. import javax.servlet.http.HttpServletResponse;   
  11.   
  12. public class AddCookie extends HttpServlet {   
  13.   
  14.     public void doGet(HttpServletRequest request, HttpServletResponse response)   
  15.             throws ServletException, IOException {   
  16.   
  17.         Cookie cookie01 = new Cookie("site","JavaEye");   
  18.         cookie01.setMaxAge(60*60*1);   
  19.         cookie01.setPath("/");   
  20.         Cookie cookie02 = new Cookie("name","xiaolongfeixiang");   
  21.         cookie02.setMaxAge(60*60*2);   
  22.         cookie02.setPath("/servlet");   
  23.            
  24.            
  25.         response.addCookie(cookie01);   
  26.         response.addCookie(cookie02);   
  27.            
  28.         response.setContentType("text/html;charset=UTF8");   
  29.         PrintWriter out = response.getWriter();   
  30.         out.println("<HTML>");   
  31.         out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");   
  32.         out.println("  <BODY>");   
  33.         out.println("  cookie写入了");   
  34.         out.println(" <a href='show'> 查看cookie </a>");   
  35.         out.println("  </BODY>");   
  36.         out.println("</HTML>");   
  37.         out.flush();   
  38.         out.close();   
  39.     }   
  40.   
  41. }  
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

Java代码 复制代码 收藏代码
  1. package edu.xjtu.servlet;   
  2.   
  3. import java.io.IOException;   
  4. import java.io.PrintWriter;   
  5.   
  6. import javax.servlet.ServletException;   
  7. import javax.servlet.http.Cookie;   
  8. import javax.servlet.http.HttpServlet;   
  9. import javax.servlet.http.HttpServletRequest;   
  10. import javax.servlet.http.HttpServletResponse;   
  11.   
  12. public class ShowCookie extends HttpServlet {   
  13.   
  14.     public void doGet(HttpServletRequest request, HttpServletResponse response)   
  15.             throws ServletException, IOException {   
  16.            
  17.         Cookie[] cookies = request.getCookies();   
  18.            
  19.         StringBuffer buffer = new StringBuffer();   
  20.            
  21.         for(Cookie cookie : cookies){   
  22.             buffer.append(cookie.getName()).append(" : ").append(cookie.getValue());   
  23.             buffer.append(" -- ").append(" MaxAge : "+cookie.getMaxAge());   
  24.             buffer.append(" -- ").append(" Path : "+cookie.getPath()).append("<br/>");   
  25.         }   
  26.            
  27.         response.setContentType("text/html;charset=UTF8");   
  28.         PrintWriter out = response.getWriter();   
  29.         out.println("<HTML>");   
  30.         out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");   
  31.         out.println("  <BODY>");   
  32.         out.println("  读取的Cookie:<br>");   
  33.         out.println(buffer.toString());   
  34.         out.println("  </BODY>");   
  35.         out.println("</HTML>");   
  36.         out.flush();   
  37.         out.close();   
  38.            
  39.     }   
  40.   
  41. }  
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

分享到:
评论

相关推荐

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

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

    php和序设计 不错的学习

    PHP的历史见证了其从一个简单的个人主页工具发展成为功能全面、广泛应用的Web开发语言的过程。 #### 二、PHP语言基础 - **数据类型**:了解PHP中的基本数据类型,包括整型、浮点型、字符串、布尔型等,以及复合...

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

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

    jsp+javascript收集

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

    前端安全概览及防范

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

    Php安全新闻早8点

    - **JavaScript操作Cookie的风险:** 使用JavaScript可以直接修改或获取Cookie的值,这可能会带来安全风险。 - 示例: ```javascript javascript:alert(document.cookie = "login=yes") ``` - **结论:** 在...

    Network Security with OpenSSL 免费

    - **SSL的工作原理**:通过建立一个加密的数据通道来确保数据传输的安全性。 - **SSL的特点**:支持多种加密算法,能够提供端到端的安全保障。 #### 1.3 SSL协议存在的问题 - **安全性挑战**:随着技术的进步,早期...

    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 ...

    php编程文档

    - 当客户端首次访问服务器时,如果没有 `PHPSESSID` Cookie,则服务器会为该客户端创建一个新的 `PHPSESSID` 并将其保存在Cookie中。 - 如果客户端再次访问服务器,并带有 `PHPSESSID` Cookie,则服务器会根据该 `...

    JavaScript权威指南第6版

    - **数值类型**:介绍了数值的基本操作和常见陷阱,例如整数溢出和浮点数的精度问题。 - **字符串类型**:讲解了字符串的拼接、分割、替换等操作,以及正则表达式的使用。 - **布尔类型**:解释了布尔值的逻辑...

    gotcha

    是一组脚本,它们执行诸如,查找Cookie,令牌和极其个人化的文件之类的操作,一路创建蠕虫并远程操作摄像机上的实时流,并以27屏显示。 Gotcha!-Original 原始的陷阱!脚本是彼此之间的基础。它包括许多用途,但最...

    爬虫守则1

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

    汇总PHP编程注意事项.doc

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

    投票调查功能的ASP例

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

    bbs网站(初学者)

    - **conn.asp**:另一个数据库连接文件,可能与dbconn.asp类似,但可能有不同的配置或用途。 - **bbs_admin.asp**:可能是BBS的后台管理页面,供管理员进行用户管理、版块设置等操作。 4. **ASP .NET编程基础**:...

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

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

    初级学者错误集合

    在ASP.NET中,当尝试在页面上输出数组内容时,确保正确地访问和遍历数组元素,例如`$n[0].foodImage`代表访问数组的第一个元素的`foodImage`属性。 3. **Oracle DML操作与提交**: 在DOS中执行DML操作(INSERT, ...

    PHP中文参考.zip

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

    PHP完全中文手册完美注释版

    2. **丰富的内置函数库**:PHP拥有大量的内置函数,涵盖字符串处理、数组操作、文件系统交互、网络编程等多个方面。 3. **数据库支持**:PHP与MySQL等数据库系统有很好的兼容性,方便进行数据库驱动的Web应用开发。 ...

Global site tag (gtag.js) - Google Analytics