问题描述:
在web项目中想要测试cookie的删除操作,也就是cookie.setMaxAge(0)操作,明明删除了所有的cookie,但是刷新一次浏览器,也就是重复一次请求后cookie的数目有变化。
解决:
重点,需要了解request 和response的运行机制:
代码:
<%
Cookie myCookie1 = new Cookie("myCookieName9","myCookieValue1");
response.addCookie(myCookie1)
Cookie temp = null
Cookie[] cookieArr
cookieArr = request.getCookies()
int time = 0
int length = 0
if(cookieArr != null
length = cookieArr.length
out.println("length is :" + length+"<br>")
for(time = 0; time < length;time++){
temp = cookieArr[time]
temp.setMaxAge(0); //删除cookie操作
response.addCookie(temp); //一定要有此操
if(temp != null){
out.println("cookie's name :"+temp.getName()+"<br>")
out.println("cookie's value :"+temp.getValue()+"<br>")
}else
out.println("there is no cookie"
);
}
%>
1、第一次请求
在浏览器第一次输入url请求,当请求发送到客户端时候request是没有cookie的,所以length的值为0,代码不进入for循环,所以页面只会执绿色部分,也就是只会显示length = 0;
但是的注意的是,这个时候因为执行了
response.addCookie(myCookie1)语句,当服务器响应浏览器请求时response里面有cookie,而且有两个cookie,一个是记录session(会话),另一个是自己new的cookie。 所以在浏览器端虽然显示了length为0,其实现在在浏览器端是有两个cookie的!!!
2、第二次请求
当刷新浏览器时候,浏览器再次向服务器(tomcat)发送请求,这个request中是有两个cookie的。
但是执行到
response.addCookie(myCookie1)语句不会在response中重复添加,因为cookie名一样(也就是myCookieName9,不是对象名)。
接着,length的值为2。。
代码进入for循环,此时数组中有两个cookie,都是从request中获取的。
执行到下面红色的两条删除操作时候
意为在浏览器端删除cookie,并不会在服务器立马删除,而是会将cookie add到response中发送到浏览器端,在浏览器端进行删除
所以紧接着的两条out语句照样会输出之前的两个cookie。。所以执行完毕后将response发送到浏览器,里面包含两个MaxAge = 0的cookie,
意为在浏览器删除这两个cookie(也就是下一次请求request中不含这两个cookie),执行结果为:
此时浏览器中其实是没有cookie的,所以到第三次request请求,resquest中是没有cookie的,所以又会回到第一次请求的结果中。