码迷,mamicode.com
首页 > 其他好文 > 详细

cookie的深入分析与研究

时间:2014-08-29 13:12:48      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:java   cookie   jsp   cookies   session   


首先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 OK
Date: Fri, 04 Feb 2014 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday, 14-Feb-07 22:03:38 GMT; 
                 path=/; domain=tutorialspoint.com
Connection: close
Content-Type: text/html
如果浏览器被配置成可存储cookies,那么它将会保存这些信息直到过期。如果用户访问的任何页面匹配了cookie中的路径和域名,那么浏览器将会重新将这个cookie发回给服务器。浏览器端的信息头长得就像下面这样
GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: 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{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		this.doGet(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		String 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);
		
		// 在响应头部添加cookie
		resp.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>");
  }
%>



cookie的深入分析与研究

标签:java   cookie   jsp   cookies   session   

原文地址:http://blog.csdn.net/qzp1991/article/details/38921447

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!