cookie的深入分析与研究
来源:互联网 发布:交大软件工程硕士 在职 编辑:程序博客网 时间:2024/06/04 17:50
首先Cookies是存储在客户机的文本文件,它们保存了大量用户信息。
从Cookie的源码可以看出它实现了Cloneable接口,
以下是Cookie的构造方法,可以看出它是以键值对的形式存放的
public Cookie(String name, String value) {if (!isToken(name)|| name.equalsIgnoreCase("Comment")// rfc2019|| name.equalsIgnoreCase("Discard")// 2019++|| name.equalsIgnoreCase("Domain")|| name.equalsIgnoreCase("Expires")// (old cookies)|| name.equalsIgnoreCase("Max-Age")// rfc2019|| name.equalsIgnoreCase("Path")|| name.equalsIgnoreCase("Secure")|| name.equalsIgnoreCase("Version")|| name.startsWith("$") ) { String errMsg = lStrings.getString("err.cookie_name_is_token"); Object[] errArgs = new Object[1]; errArgs[0] = name; errMsg = MessageFormat.format(errMsg, errArgs); throw new IllegalArgumentException(errMsg);}this.name = name;this.value = value; }其中可以看出有一个isToken()方法,此方法的作用是什么呢,从源码中可以看出此方法用于比较确定此处的name是否为预留的关键字,如果是则返回false,就在cookie的构造方法之中就会抛出异常;不是预留关键字,则调用此构造函数。
private boolean isToken(String value) {int len = value.length();for (int i = 0; i < len; i++) { char c = value.charAt(i); if (c < 0x20 || c >= 0x7f || tspecials.indexOf(c) != -1)return false;}return true; }那信息传输过程中,cookie是存放在http响应头之中,在jsp中设置一个cookie信息需要将如下信息发送给服务器
HTTP/1.1 200 OKDate: Fri, 04 Feb 2014 21:03:38 GMTServer: Apache/1.3.9 (UNIX) PHP/4.0b3Set-Cookie: name=xyz; expires=Friday, 14-Feb-07 22:03:38 GMT; path=/; domain=tutorialspoint.comConnection: closeContent-Type: text/html如果浏览器被配置成可存储cookies,那么它将会保存这些信息直到过期。如果用户访问的任何页面匹配了cookie中的路径和域名,那么浏览器将会重新将这个cookie发回给服务器。浏览器端的信息头长得就像下面这样
GET / HTTP/1.0Connection: Keep-AliveUser-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)Host: zink.demon.co.uk:1126Accept: image/gif, */*Accept-Encoding: gzipAccept-Language: enAccept-Charset: iso-8859-1,*,utf-8Cookie: name=xyz
那么我们在jsp中是如何创建和使用cookie的呢
1)创建一个Cookie对象: 调用Cookie的构造函数,使用一个cookie名称和值做参数,它们都是字符串。
2) 设置有效期:调用setMaxAge()函数表明cookie在多长时间(以秒为单位)内有效。下面的操作将有效期设为了24小时。
3) 将cookie发送至HTTP响应头中:调用response.addCookie()函数来向HTTP响应头中添加cookies。
下面是一个保存用户名和密码的信息到cookie之中的代码
web.xml(web程序的人口之处)
<servlet> <servlet-name>Cookie</servlet-name> <servlet-class>com.qzp.servlet.cookieServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Cookie</servlet-name> <url-pattern>/cookie</url-pattern> </servlet-mapping>
cookieTest.jsp
<body> <form action="cookie" method="post"> 用户名:<input type="text" name="name" > 密码:<input type="password" name="password" > <input type="submit" value="登陆"> </form> </body>
后台创建cookie和设置cookie的代码,cookie的值是通过响应头部添加到本地文件之中。
public class cookieServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {this.doGet(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// TODO Auto-generated method stubString name=req.getParameter("name");String password=req.getParameter("password");//以键值对的形式存放Cookie cookie1=new Cookie("username",name);Cookie cookie2=new Cookie("psw",password);//设置过期时间为24小时cookie1.setMaxAge(60*60*24);cookie2.setMaxAge(60*60*24);// 在响应头部添加cookieresp.addCookie(cookie1);resp.addCookie( cookie2 );req.getRequestDispatcher("cookieResult.jsp").forward(req, resp);}}cookieResult.jsp,通过一个el表达式来获取cookie的值,其格式是${ cookie. 键. value}(如果对EL表达式不是很熟悉的话,可以看我接下来的教程)
<body><center><h1>result</h1></center><ul><li><p><b>name:</b>${cookie.username.value}</p></li><li><p><b>password:</b>${cookie.psw.value}</p></li></ul></body>结果会返回你所输入的用户名和密码的值。(当然密码的值放在cookie中是很不安全的,建议放到session服务器端之中,此处只做演示之用)
此外还有cookies数组用于输出所有存放在本地的cookie值,如以下代码可以遍历本地所有的cookie值(out是jsp的内置对象,可以用于向页面打印输出)
<center><h1>Reading Cookies</h1></center><% Cookie cookie = null; Cookie[] cookies = null; // 获取cookies的数据,是一个数组 cookies = request.getCookies(); if( cookies != null ){ out.println("<h2> Found Cookies Name and Value</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; out.print("Name : " + cookie.getName( ) + ", "); out.print("Value: " + cookie.getValue( )+" <br/>"); } }else{ out.println("<h2>No cookies founds</h2>"); }%>
0 0
- cookie的深入分析与研究
- HttpSession的深入分析与研究
- java 异常的深入研究与分析
- Java异常的深入研究与分析
- 异常的深入研究与分析
- Java异常的深入研究与分析
- Java异常的深入研究与分析
- Java异常的深入研究与分析
- Java异常的深入研究与分析
- Java异常的深入研究与分析
- Java异常的深入研究与分析
- 异常的深入研究与分析
- Java异常的深入研究与分析
- Java异常的深入研究与分析
- Java异常的深入研究与分析
- Java异常的深入研究与分析
- Java异常的深入研究与分析
- Java异常的深入研究与分析
- 二叉树的深度优先遍历与广度优先遍历
- Windows8中将窗体背景修改为苹果绿
- 緣是心靈的契合
- The reference to entity "preinfo" must end with the ';'delimiter.
- 关于mysqldump的ERROR 1449 问题
- cookie的深入分析与研究
- Oracle的RBO和CBO
- 题目1361:翻转单词顺序
- 从放大器开始谈模拟电子
- java使用jxl导入Excel
- Hibernate查询方法总结
- ORA-06575: 程序包或函数 NO_VM_DROP_PROC 处于无效状态
- 题目1538:GrassLand密码
- USRP母板上处理器的作用