操作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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章