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
原创粉丝点击