`
lushuaiyin
  • 浏览: 670941 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

cookie的操作

 
阅读更多

学习操作cookie,首先要了解cookie的机制。这个网上优秀的文章太多了。

本篇文章练习如何操作cookie。

说道操作,无非就是“增删改查”四个字。

cookie操作的api很简单,马上先写一个看看。

一,新增cookie

package org.hd.report.action;

import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.rd.framework.struts.action.CommonAction;

import com.opensymphony.xwork2.ActionContext;

//
public class CookieAction  extends CommonAction{
	
	public String showcookie() throws Exception{
		
		ActionContext ctx = ActionContext.getContext();
		HttpServletResponse response = (HttpServletResponse) ctx.get(ServletActionContext.HTTP_RESPONSE); 
		HttpServletRequest request  = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST); 
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		

		Cookie[] cookies = request.getCookies();//这样便可以获取一个cookie数组

		for(Cookie cookie : cookies){
//		    cookie.getName();// get the cookie name
//		    cookie.getValue(); // get the cookie value
		    System.out.println("cookie;----名字:"+cookie.getName()+"---值:"+cookie.getValue()+"---路径:"+cookie.getPath());
		}
		Date dd=new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Cookie ck = new Cookie("cookie-name-lsy",sdf.format(dd));
		ck.setComment("this is the comment from lsy ");
//		ck.setDomain("lsydoman");
		ck.setMaxAge(360);
		ck.setPath("/haha");
//		ck.setVersion(1);
		System.out.println("服务端设置cookie:"+ck.toString());
		
		response.addCookie(ck);
		
		//out.println(ck.toString());
		return SUCCESS;
	}
	
	public String execute() throws Exception{
		return SUCCESS;
	}
	
}

在cookie的路径下(也是浏览器临时文件的路径,浏览器中的InterNet选项中,浏览历史记录--设置--当前位置)

打开这个文件内容如下:

cookie-name-lsy
"2012-11-26 17:38:24"
helpdesk.citicsinfo.com/haha
1536
2652032000
30264250
3356876643
30264249
*

---------------------------------------------------------------------------------------------------------------

尝试着修改某些属性值,看看效果:
ck.setPath("/wawa.txt");
得到wawa.txt文件

cookie-name-lsy
"2012-11-26 17:39:15"
helpdesk.citicsinfo.com/wawa.txt
1536
3162032000
30264250
3857085253
30264249
*

---------------------------------------------------------------------------------------------------------------
修改值:
ck.setDomain("helpdesk.citicsinfo.com");
ck.setPath("/dom");
结果出现dom文件

cookie-name-lsy
"2012-11-26 17:40:38"
helpdesk.citicsinfo.com/dom
1536
3992032000
30264250
397875759
30264250
*
---------------------------------------------------------------------------------------------------------------


修改值:
ck.setDomain("xxxxxx");
ck.setPath("/dom2");
结果没有生成cookie文件!

---------------------------------------------------------------------------------------------------------------

修改值:
ck.setDomain("helpdesk.citicsinfo.com");
ck.setPath("/lsy/kk");
结果出现kk文件
(没有出现我预期的先生成lsy文件夹然后再次文件夹下再生成kk,而是直接生成了kk!
但是cookie里面的域名改变了helpdesk.citicsinfo.com/lsy/kk)


cookie-name-lsy
"2012-11-26 18:00:24"
helpdesk.citicsinfo.com/lsy/kk
1536
2967130112
30264253
3668059527
30264252
*

---------------------------------------------------------------------------------------------------------------


在服务端每次都会遍历打印cookie,为了测试数据的准确,我每次都是先把
cookie目录下的东西先删除再做测试的,但是每次都会有一个JSESSIONID出现。
如下:
cookie;----名字:JSESSIONID---值:6B2B5B9F6123D2B156256AB3BE2C849C---路径:null
它的路径是null。
为什么每次都有这个cookie呢?网上搜了一下:
原来是tomcat服务器创建session的cookie。
session的创建需要cookie支持的,看到这里也许明白了,为什么浏览器能识别
服务器的session,原来是服务器在客户端会先创建cookie,把sessionId保存起来,
党浏览器关闭时这个cookie就消失,这样就是session的基本原理。

网上一段文摘:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
所谓session可以这样理解:当与服务端进行会话时,比如说登陆成功后,服务端会为用户开壁一块内存区间,
用以存放用户这次会话的一些内容,比如说用户名之类的。那么就需要一个东西来标志这个内存区间是你的而不是别人的,
这个东西就是session id(jsessionid只是tomcat中对session id的叫法,在其它容器里面,不一定就是叫jsessionid了。),
而这个内存区间你可以理解为session。
然后,服务器会将这个session id发回给你的浏览器,放入你的浏览器的cookies中(这个cookies是内存cookies,
跟一般的不一样,它会随着浏览器的关闭而消失)。
之后,只有你浏览器没有关闭,你每向服务器发请求,服务器就会从你发送过来的cookies中拿出这个session id,
然后根据这个session id到相应的内存中取你之前存放的数据。
但是,如果你退出登陆了,服务器会清掉属于你的内存区域,所以你再登的话,会产生一个新的session了。

这是一个保险措施 因为Session默认是需要Cookie支持的,但有些客户浏览器是关闭Cookie的【而jsessionid是存储在Cookie中的,
如果禁用Cookie的话,也就是说服务器那边得不到jsessionid,这样也就没法根据jsessionid获得对应的session了,获得不了session就
得不到session中存储的数据了。】这个时候就需要在URL中指定服务器上的session标识,也
就是类似于“jsessionid=5F4771183629C9834F8382E23BE13C4C”
这种格式。用一个方法(忘了方法的名字)处理URL串就可以得到
这个东西,这个方法会判断你的浏览器是否开启了Cookie,如果他认为应该加他就会加上去。
session是有一定作用域的,而且是有时间限制的。
jsessionid是服务器那边生成的,因为cookie是服务器那边送到客户端的信息。
不管能不能修改jsessionid,都不应该修改,如果你修改了,这就失去了jessionid的自身意义了,
你修改的话,你让服务器那边如何找到对应的session?找不到的话,你存放在那个session中的数据不是取不到了吗?


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

操作cookie很简单,常用的方法也就那么几个:
getDomain();返回cookie的域名.   
getMaxAge();返回cookie的存活时间   
getName();返回cookie的名字   
getPath();返回cookie适用的路径   
getSecure();如果浏览器通过安全协议发送Cookie将返回true值,如果浏览器使用标准协议刚返回false值   
getValue();返回cookie的值   
getVersion();返回cookie所遵从的协议版本

setComment(String purpose);设置cookie的注释   
setPath(String url);设置Cookie的适用路径   
setSecure(Boolean flag);设置浏览器是否仅仅使用安全协议来发送cookie,例如使用Https或ssl   
setValue(String newvalue);cookie创建后设置一个新的值   
setVersion(int v);设置cookie所遵从的协议版本.
setDomain(String ss) 设置域.
setMaxAge(int time) 设置失效时间,秒。参数为负数代表关闭浏览器时清除cookie,参数为0时代表删除cookie,参数为正数时代表cookie存在多少秒

Cookie版本:
目前有两个版本:
版本0 : 由Netscape公司制定的,也被几乎所有的浏览器支持. Java中为了保持兼容性, 目前只支持到版本0,
Cookie的内容中不能空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号。
版本1 : 根据RFC 2109文档制定的. 放宽了很多限制.
上面所限制的字符都可以使用. 但为了保持兼容性, 应该尽量避免使用这些特殊字符.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

继续修改在value中写入中文,则报错:


严重: Servlet.service() for servlet default threw exception
java.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value

因为中文的原因,导致这样的报错。解决如下:

///////////////////////////////////////////
Date dd=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String zhvalue1= java.net.URLEncoder.encode("时间:"+sdf.format(dd),"utf-8");
Cookie ck = new Cookie("cookie-name-lsy",zhvalue1);

String zhvalue2 = java.net.URLEncoder.encode("this is the comment from lsy 你好 xxxxxx","utf-8");
ck.setComment(zhvalue2);
ck.setDomain("helpdesk.citicsinfo.com");//helpdesk.citicsinfo.com
ck.setMaxAge(360);
ck.setPath("/chinese1");
//ck.setVersion(1);
System.out.println("服务端设置cookie:"+ck.toString());

response.addCookie(ck);


使用java.net.URLEncoder后,如上
出现chinese1文件,内容:

cookie-name-lsy
%E6%97%B6%E9%97%B4%EF%BC%9A2012-11-27+09%3A28%3A37
helpdesk.citicsinfo.com/chinese1
1536
1551381632
30264383
2251867240
30264382
*

二,读取cookie

把代码修改如下:


import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.rd.framework.struts.action.CommonAction;

import com.opensymphony.xwork2.ActionContext;

//
public class CookieAction  extends CommonAction{
	
	public String addcookie() throws Exception{
		
		ActionContext ctx = ActionContext.getContext();
		HttpServletResponse response = (HttpServletResponse) ctx.get(ServletActionContext.HTTP_RESPONSE); 
		HttpServletRequest request  = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST); 
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		
		///////////////////////////////////////////
		Date dd=new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String zhvalue1= java.net.URLEncoder.encode("时间:"+sdf.format(dd),"utf-8");
		Cookie ck = new Cookie("cookie-name-lsy",zhvalue1);
		
		String zhvalue2 = java.net.URLEncoder.encode("this is the comment from lsy 你好 xxxxxx","utf-8");
		ck.setComment(zhvalue2);
//		ck.setDomain("helpdesk.citicsinfo.com");//helpdesk.citicsinfo.com
		ck.setMaxAge(3600);
		ck.setPath("/chinese12");
//		ck.setPath("/");
		
//		ck.setVersion(1);
		System.out.println("服务端设置cookie:"+ck.toString());
		
		response.addCookie(ck);
		
		return SUCCESS;
	}
	
public String showcookie() throws Exception{
		
		ActionContext ctx = ActionContext.getContext();
		HttpServletResponse response = (HttpServletResponse) ctx.get(ServletActionContext.HTTP_RESPONSE); 
		HttpServletRequest request  = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST); 
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		
		System.out.println("request.getContextPath:"+request.getContextPath());
		Cookie[] cookies = request.getCookies();//这样便可以获取一个cookie数组
		for(Cookie cookie : cookies){
		    System.out.println("cookie----名字:"+cookie.getName());
		    System.out.println("值:"+cookie.getValue());
		    System.out.println("路径:"+cookie.getPath());
		    System.out.println("失效时间:"+cookie.getMaxAge()+"秒");
		    System.out.println("注释:"+cookie.getComment());
		    System.out.println("版本:"+cookie.getVersion()+"。安全:"+cookie.getSecure()+"。域名:"+cookie.getDomain());
		    System.out.println("---------------------------------------------------------------------------------------");
		}
		
		return SUCCESS;
	}
	
	public String execute() throws Exception{
		return SUCCESS;
	}
	
}



现在我把添加cookie的代码和显示cookie的代码分开,这样逻辑更加清楚。
会了怎么添加cookie,下面当然是怎么读取,修改,删除cookie。
增删改查都会了此算是“会操作”

操作步骤:
先把cookie临时目录下的东西清空(路径到这里查看:浏览器中的InterNet选项中,浏览历史记录--设置--当前位置)
然后发一个请求添加一个cookie,到这个目录下看看(记得要右键刷新才能显示出来),
这时有了cookie我文件chinese12。
然后发请求读取所有cookie,从打印结果看,我只取到了回话cookie,即jsessionId。
我添加的cookie没有读取出来。
查了一下原因,是因为路径的原因,就是ck.setPath("/chinese12");
这样生成的文件名就是chinese12,但是读取的时候request.getCookies();
这行代码是默认路径,在读取时怎么读取指定的路径呢?网上我也没查到。
所以只好把添加的cookie路径改成默认的。即ck.setPath("/");

生成的cookie文件名是:cookie:lushuaiyin@helpdesk.citics.com/
可见这种默认的明明方式是: cookie:系统用户名@工程域名

cookie-name-lsy
%E6%97%B6%E9%97%B4%EF%BC%9A2012-11-27+11%3A28%3A05
helpdesk.citicsinfo.com/
1536
2552166528
30264407
912453727
30264399
*

后台打印:

服务端设置cookie:javax.servlet.http.Cookie@9f1ca0
request.getContextPath:
cookie----名字:JSESSIONID
值:CD62C08FC2C9312F51E724C77CDD9850
路径:null
失效时间:-1秒
注释:null
版本:0。安全:false。域名:null
---------------------------------------------------------------------------------------
cookie----名字:cookie-name-lsy
值:%E6%97%B6%E9%97%B4%EF%BC%9A2012-11-27+11%3A28%3A05
路径:null
失效时间:-1秒
注释:null
版本:0。安全:false。域名:null
---------------------------------------------------------------------------------------
修改读取时要对中文解码:

Cookie[] cookies = request.getCookies();//这样便可以获取一个cookie数组
for(Cookie cookie : cookies){
String zhname=cookie.getName()!=null?java.net.URLDecoder.decode(cookie.getName(), "utf-8"):cookie.getName();
System.out.println("cookie----名字:"+zhname );

String zhvalue=cookie.getValue()!=null?java.net.URLDecoder.decode(cookie.getValue(), "utf-8"):cookie.getValue();
System.out.println("值:"+zhvalue);

String zhpath=cookie.getPath()!=null?java.net.URLDecoder.decode(cookie.getPath(), "utf-8"):cookie.getPath();
System.out.println("路径:"+zhpath);

System.out.println("失效时间:"+cookie.getMaxAge()+"秒");

String zhcomment=cookie.getComment()!=null?java.net.URLDecoder.decode(cookie.getComment(), "utf-8"):cookie.getComment();
System.out.println("注释:"+zhcomment);

System.out.println("版本:"+cookie.getVersion()+"。安全:"+cookie.getSecure()+"。域名:"+cookie.getDomain());
System.out.println("---------------------------------------------------------------------------------------");
}


打印:
request.getContextPath:
cookie----名字:JSESSIONID
值:CD62C08FC2C9312F51E724C77CDD9850
路径:null
失效时间:-1秒
注释:null
版本:0。安全:false。域名:null
---------------------------------------------------------------------------------------
cookie----名字:cookie-name-lsy
值:时间:2012-11-27 11:52:09
路径:null
失效时间:-1秒
注释:null
版本:0。安全:false。域名:null
---------------------------------------------------------------------------------------

从打印页可以看出中文已经能正常显示了,
JSESSIONID的失效时间是-1,就是在浏览器关闭的时候会清除这个sessionId.
奇怪的是我的cookie的路径,注释,域名都是null,这个很费解啊。
网上搜了半天,好像就我碰到了,别人就没遇见过这问题吗?

暂时放一边吧,有键值对就能实现功能了。

三,删除cookie

增加一个方法;

public String delcookie() throws Exception{
	
	ActionContext ctx = ActionContext.getContext();
	HttpServletResponse response = (HttpServletResponse) ctx.get(ServletActionContext.HTTP_RESPONSE); 
	HttpServletRequest request  = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST); 
	response.setCharacterEncoding("UTF-8");
	PrintWriter out = response.getWriter();
	
	Cookie[] cookies = null;//这样便可以获取一个cookie数组
	if(request.getCookies()!=null){
		cookies=request.getCookies();
		
		for(Cookie cookie : cookies){
			String zhname=cookie.getName()!=null?java.net.URLDecoder.decode(cookie.getName(), "utf-8"):cookie.getName();
		    System.out.println("cookie----名字:"+zhname );
		    
		    String zhvalue=cookie.getValue()!=null?java.net.URLDecoder.decode(cookie.getValue(), "utf-8"):cookie.getValue();
		    System.out.println("值:"+zhvalue);
		    
		    String zhpath=cookie.getPath()!=null?java.net.URLDecoder.decode(cookie.getPath(), "utf-8"):cookie.getPath();
		    System.out.println("路径:"+zhpath);
		    
		    System.out.println("失效时间:"+cookie.getMaxAge()+"秒");
		    
		    String zhcomment=cookie.getComment()!=null?java.net.URLDecoder.decode(cookie.getComment(), "utf-8"):cookie.getComment();
		    System.out.println("注释:"+zhcomment);
		    
		    System.out.println("版本:"+cookie.getVersion()+"。安全:"+cookie.getSecure()+"。域名:"+cookie.getDomain());
		    //删除
		    if(zhname.trim().equals("cookie-name-lsy")){
		    	//从上面打印的数据看,路径是null,注释,域也是null。
		    	//而卧添加cookie的时候确实是有注释内容的,在删除时也遇到了问题,
		    	//就是如果路径是null据删除不了,这个已经做过测试了。
		    	//删除时必须重新设置path,这样才能正常删除!
		    	cookie.setPath("/");//必须设置路径!如果是其他路径,也要相应的设置。
		    	cookie.setMaxAge(0);//删除时设置为0
		    	System.out.println("----cookie-name-lsy已删除--------------");
		    	response.addCookie(cookie);
		    }
		    System.out.println("---------------------------------------------------------------------------------------");
		}
	}
	
	return SUCCESS;
}

打印:

cookie----名字:cookie-name-lsy
值:时间:2012-11-27 14:46:44
路径:null
失效时间:-1秒
注释:null
版本:0。安全:false。域名:null
----cookie-name-lsy已删除--------------
---------------------------------------------------------------------------------------
//从上面打印的数据看,路径是null,注释,域也是null。
//而我添加cookie的时候确实是有注释内容的,在删除时也遇到了问题,
//就是如果路径是null据删除不了,这个已经做过测试了。
//删除时必须重新设置path,这样才能正常删除!
cookie.setPath("/");//必须设置路径!如果是其他路径,也要相应的设置。
cookie.setMaxAge(0);//删除时设置为0

四,修改cookie

增加方法

public String editcookie() throws Exception{

ActionContext ctx = ActionContext.getContext();
HttpServletResponse response = (HttpServletResponse) ctx.get(ServletActionContext.HTTP_RESPONSE);
HttpServletRequest request = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST);
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();

Cookie[] cookies = null;//这样便可以获取一个cookie数组
if(request.getCookies()!=null){
cookies=request.getCookies();

for(Cookie cookie : cookies){
String zhname=cookie.getName()!=null?java.net.URLDecoder.decode(cookie.getName(), "utf-8"):cookie.getName();
System.out.println("cookie----名字:"+zhname );

String zhvalue=cookie.getValue()!=null?java.net.URLDecoder.decode(cookie.getValue(), "utf-8"):cookie.getValue();
System.out.println("值:"+zhvalue);

String zhpath=cookie.getPath()!=null?java.net.URLDecoder.decode(cookie.getPath(), "utf-8"):cookie.getPath();
System.out.println("路径:"+zhpath);

System.out.println("失效时间:"+cookie.getMaxAge()+"秒");

String zhcomment=cookie.getComment()!=null?java.net.URLDecoder.decode(cookie.getComment(), "utf-8"):cookie.getComment();
System.out.println("注释:"+zhcomment);

System.out.println("版本:"+cookie.getVersion()+"。安全:"+cookie.getSecure()+"。域名:"+cookie.getDomain());
//删除
if(zhname.trim().equals("cookie-name-lsy")){
//从上面打印的数据看,路径是null,注释,域也是null。
//而我添加cookie的时候确实是有注释内容的
//修改和删除也一样,必须设置路径path,不然浏览器找不到这个cookie
cookie.setPath("/");//必须设置路径!如果是其他路径,也要相应的设置。
cookie.setValue("editvalue");
System.out.println("----cookie-name-lsy已经成功修改--------------");
response.addCookie(cookie);
}
System.out.println("---------------------------------------------------------------------------------------");
}
}

return SUCCESS;
}

操作步骤;
先清空浏览器临时文件(也是cookie的目录);
添加一个cookie,查询遍历打印出所有cookie的信息,在目录下右键刷新,看cookie是否存在;
发送修改cookie的请求,然后再查询遍历所有cookie信息。
这时发现cookie的内容已经改变了。


把上面几个方法也优化一下,整个action的完整代码如下:

package org.hd.report.action;

import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.rd.framework.struts.action.CommonAction;

import com.opensymphony.xwork2.ActionContext;

//
public class CookieAction  extends CommonAction{
	
	public String addcookie() throws Exception{
		
		ActionContext ctx = ActionContext.getContext();
		HttpServletResponse response = (HttpServletResponse) ctx.get(ServletActionContext.HTTP_RESPONSE); 
		HttpServletRequest request  = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST); 
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		
		///////////////////////////////////////////
		Date dd=new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String zhvalue1= java.net.URLEncoder.encode("时间:"+sdf.format(dd),"utf-8");
		Cookie ck = new Cookie("cookie-name-lsy",zhvalue1);
		
		String zhvalue2 = java.net.URLEncoder.encode("thisisthecommentfromlsyxxxxx","utf-8");
		ck.setComment(zhvalue2);
//		ck.setDomain("helpdesk.citicsinfo.com");//helpdesk.citicsinfo.com
		ck.setMaxAge(3600);
//		ck.setPath("/chinese12");
		ck.setPath("/");//设置这个默认路径,在读取时才能正常读取
		
//		ck.setVersion(1);
		System.out.println("服务端设置cookie:"+ck.toString());
		
		response.addCookie(ck);
		
		return SUCCESS;
	}
	
public String showcookie() throws Exception{
		
		ActionContext ctx = ActionContext.getContext();
		HttpServletResponse response = (HttpServletResponse) ctx.get(ServletActionContext.HTTP_RESPONSE); 
		HttpServletRequest request  = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST); 
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		
		System.out.println("request.getContextPath:"+request.getContextPath());
		Cookie[] cookies = null;//这样便可以获取一个cookie数组
		if(request.getCookies()!=null){
			cookies=request.getCookies();
			System.out.println("-----------------遍历cookie  start------------------------------------" );
			for(Cookie cookie : cookies){
				String zhname=cookie.getName()!=null?java.net.URLDecoder.decode(cookie.getName(), "utf-8"):cookie.getName();
			    System.out.println("cookie----名字:"+zhname );
			    
			    String zhvalue=cookie.getValue()!=null?java.net.URLDecoder.decode(cookie.getValue(), "utf-8"):cookie.getValue();
			    System.out.println("值:"+zhvalue);
			    
			    String zhpath=cookie.getPath()!=null?java.net.URLDecoder.decode(cookie.getPath(), "utf-8"):cookie.getPath();
			    System.out.println("路径:"+zhpath);
			    
			    System.out.println("失效时间:"+cookie.getMaxAge()+"秒");
			    
			    String zhcomment=cookie.getComment()!=null?java.net.URLDecoder.decode(cookie.getComment(), "utf-8"):cookie.getComment();
			    System.out.println("注释:"+zhcomment);
			    
			    System.out.println("版本:"+cookie.getVersion()+"。安全:"+cookie.getSecure()+"。域名:"+cookie.getDomain());
			    System.out.println("---------------------------------------------------------------------------------------");
			}
			
			System.out.println("-----------------遍历cookie  end------------------------------------" );
		}
		
		return SUCCESS;
	}

public String delcookie() throws Exception{
	
	ActionContext ctx = ActionContext.getContext();
	HttpServletResponse response = (HttpServletResponse) ctx.get(ServletActionContext.HTTP_RESPONSE); 
	HttpServletRequest request  = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST); 
	response.setCharacterEncoding("UTF-8");
	PrintWriter out = response.getWriter();
	
	Cookie[] cookies = null;//这样便可以获取一个cookie数组
	if(request.getCookies()!=null){
		cookies=request.getCookies();
		
	    
		for(Cookie cookie : cookies){
			String zhname=cookie.getName()!=null?java.net.URLDecoder.decode(cookie.getName(), "utf-8"):cookie.getName();
		    String zhvalue=cookie.getValue()!=null?java.net.URLDecoder.decode(cookie.getValue(), "utf-8"):cookie.getValue();
		    String zhpath=cookie.getPath()!=null?java.net.URLDecoder.decode(cookie.getPath(), "utf-8"):cookie.getPath();
		    String zhcomment=cookie.getComment()!=null?java.net.URLDecoder.decode(cookie.getComment(), "utf-8"):cookie.getComment();
		    
		    //删除
		    if(zhname.trim().equals("cookie-name-lsy")){
		    	//从上面打印的数据看,路径是null,注释,域也是null。
		    	//而卧添加cookie的时候确实是有注释内容的,在删除时也遇到了问题,
		    	//就是如果路径是null据删除不了,这个已经做过测试了。
		    	//删除时必须重新设置path,这样才能正常删除!
		    	cookie.setPath("/");//必须设置路径!如果是其他路径,也要相应的设置。
		    	cookie.setMaxAge(0);//删除时设置为0
		    	System.out.println("----cookie-name-lsy已删除,原始信息如下:--------------");
		    	System.out.println("cookie----名字:"+zhname );
		    	System.out.println("值:"+zhvalue);
		    	System.out.println("路径:"+zhpath);
		    	System.out.println("失效时间:"+cookie.getMaxAge()+"秒");
		    	System.out.println("注释:"+zhcomment);
		    	System.out.println("版本:"+cookie.getVersion()+"。安全:"+cookie.getSecure()+"。域名:"+cookie.getDomain());
			    
		    	response.addCookie(cookie);
		    }
		    System.out.println("---------------------------------------------------------------------------------------");
		}
		
		
	}
	
	return SUCCESS;
}
	

public String editcookie() throws Exception{
	
	ActionContext ctx = ActionContext.getContext();
	HttpServletResponse response = (HttpServletResponse) ctx.get(ServletActionContext.HTTP_RESPONSE); 
	HttpServletRequest request  = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST); 
	response.setCharacterEncoding("UTF-8");
	PrintWriter out = response.getWriter();
	
	Cookie[] cookies = null;//这样便可以获取一个cookie数组
	if(request.getCookies()!=null){
		cookies=request.getCookies();
		
		for(Cookie cookie : cookies){
			String zhname=cookie.getName()!=null?java.net.URLDecoder.decode(cookie.getName(), "utf-8"):cookie.getName();
		    String zhvalue=cookie.getValue()!=null?java.net.URLDecoder.decode(cookie.getValue(), "utf-8"):cookie.getValue();
		    //删除
		    if(zhname.trim().equals("cookie-name-lsy")){
		    	//从上面打印的数据看,路径是null,注释,域也是null。
		    	//而我添加cookie的时候确实是有注释内容的
		    	//修改和删除也一样,必须设置路径path,不然浏览器找不到这个cookie
		    	cookie.setPath("/");//必须设置路径!如果是其他路径,也要相应的设置。
		    	cookie.setValue("editvalue");
		    	cookie.setMaxAge(3600);
		    	System.out.println("----cookie-name-lsy已经成功修改--------------");
		    	response.addCookie(cookie);
		    }
		    System.out.println("---------------------------------------------------------------------------------------");
		}
	}
	
	return SUCCESS;
}


	public String execute() throws Exception{
		return SUCCESS;
	}
	
}



request.getContextPath:
-----------------遍历cookie start------------------------------------
cookie----名字:JSESSIONID
值:47BD54C0CD6284F0DBFB0EC2333722EC
路径:null
失效时间:-1秒
注释:null
版本:0。安全:false。域名:null
---------------------------------------------------------------------------------------
cookie----名字:cookie-name-lsy
值:时间:2012-11-27 15:32:45
路径:null
失效时间:-1秒
注释:null
版本:0。安全:false。域名:null
---------------------------------------------------------------------------------------
-----------------遍历cookie end------------------------------------
---------------------------------------------------------------------------------------
----cookie-name-lsy已经成功修改--------------
---------------------------------------------------------------------------------------
request.getContextPath:
-----------------遍历cookie start------------------------------------
cookie----名字:JSESSIONID
值:47BD54C0CD6284F0DBFB0EC2333722EC
路径:null
失效时间:-1秒
注释:null
版本:0。安全:false。域名:null
---------------------------------------------------------------------------------------
cookie----名字:cookie-name-lsy
值:editvalue
路径:null
失效时间:-1秒
注释:null
版本:0。安全:false。域名:null
---------------------------------------------------------------------------------------
-----------------遍历cookie end------------------------------------

到目前为止,对cookie的增删改查都已经实现,算的上“会操作”了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics