今天在处理一个删除cookie的需求.我在查询页面的时候将查询条件添加到了cookie中,这样,下一次查询的时候,我就可以带上上一次查询的条件.但是,再切换组织机构和退出登录的时候,需要删除所有的cookie.
//这里为了说明问题,只是嵌入了代码的一部分
@RequestMapping
public ModelAndView index(
@RequestParam(value = "channelName", required = false) String channelName,
@RequestParam(value = "channelStatus", required = false) String channelStatus,
@RequestParam(value = "mediaId", required = false) Long mediaId,
@RequestParam(value = "pageIndex", required = false) Integer pageIndex,
@RequestParam(value = "pageSize", required = false) Integer pageSize,
HttpSession session, HttpServletRequest request,
HttpServletResponse response) {
// 如果请求参数为空,从cookie中获取参数;如果请求参数不为空,写入cookie中保存,为下次查询提供参数
/*
* 操作cookie--如果没有带条件,则从cookie中读取条件
* 规则:当条件全部为空时,从cookie读取.当条件有一个不为空时
* 读取条件,并保存到cookie中.
*/
if (channelName == null && channelStatus == null && pageIndex == null
&& pageSize == null && mediaId == null) {
for (Cookie cookie : request.getCookies()) {
if (cookie.getName().equalsIgnoreCase("pmc.channelName")) {
channelName = java.net.URLDecoder.decode(cookie.getValue());
}
if (cookie.getName().equalsIgnoreCase("pmc.channelStatus")) {
channelStatus = cookie.getValue();
}
if (cookie.getName().equalsIgnoreCase("pmc.pageIndex")) {
pageIndex = Integer.valueOf(cookie.getValue());
}
if (cookie.getName().equalsIgnoreCase("pmc.pageSize")) {
pageSize = Integer.valueOf(cookie.getValue());
}
if (cookie.getName().equalsIgnoreCase("pmc.mediaId")) {
mediaId = Long.valueOf(cookie.getValue());
}
}
} else {
if (channelName != null) {
response.addCookie(new Cookie("pmc.channelName", java.net.URLEncoder.encode(channelName)));
}else{
//保存cookie的代码.cookie2.setMaxAge(0);设置浏览器关闭时,cookie过期
Cookie cookie2=new Cookie("pmc.channelName", null);
cookie2.setMaxAge(0);
response.addCookie(cookie2);
}
if (channelStatus != null) {
response.addCookie(new Cookie("pmc.channelStatus",
channelStatus));
}else{
//保存cookie的代码.cookie2.setMaxAge(0);设置浏览器关闭时,cookie过期
Cookie cookie2=new Cookie("pmc.channelStatus", null);
cookie2.setMaxAge(0);
response.addCookie(cookie2);
}
if (pageIndex != null) {
response.addCookie(new Cookie("pmc.pageIndex", pageIndex
.toString()));
}
if (pageSize != null) {
response.addCookie(new Cookie("pmc.pageSize", pageSize
.toString()));
}
if (mediaId != null) {
response.addCookie(new Cookie("pmc.mediaId",mediaId.toString()));
}else{
//保存cookie的代码.cookie2.setMaxAge(0);设置浏览器关闭时,cookie过期
Cookie cookie2=new Cookie("pmc.mediaId", null);
cookie2.setMaxAge(0);
response.addCookie(cookie2);
}
}我的目标,就是把这里的cookie,在退出登录时删除掉.这样的cookie值有很多,在整个系统的每一个index.do查询中都有.我要做的,就是在退出时,获取所有的cookie,然后将其删除.我是这样做的
/** 执行退出 */
@RequestMapping(value = "/logout")
public ModelAndView logout(
HttpServletRequest request,
HttpServletResponse response,
HttpSession session) {
// 获取Cookies数组
Cookie[] cookies = request.getCookies();
// 迭代查找并清除Cookie
for (Cookie cookie: cookies) {
//将cookie.setMaxAge(0)表示删除cookie.
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
}
// 修改用户登陆日志
AuthorizedUser authorizedUser = (AuthorizedUser) session.getAttribute("authorizedUser");
logService.updateLoginLog(authorizedUser.getLoginLogId());
// 销毁用户session
session.invalidate();
// 跳转到首页
ModelAndView mv = new ModelAndView("redirect:/");
return mv;
}然而,在这个过程中,发现了问题.在退出时,使用request.getCookies()获取所有的cookie时,始终都只能获取到一个系统生成的cookie.而我自己手动设置的那些个cookie根本获取不到.
经过查阅资料和试验.终于找到了问题的原因.原因在cookie2.setMaxAge(0);看看一我们是如何设置:
将cookie2.setMaxAge(0);表示,删除当前这个cookie.所以,你在其他任何地方都读取不到这个cookie.由于我没有设置cookie.setPath()和cookie.setDomain().所有没有实现真正的删除,为什么没有删除呢,可以参考这篇文章: http://tompig.iteye.com/blog/714295
通过查阅资料和测试找到解决方案:
设置的cookie2.setMaxAge(-1)才真正表示关闭浏览器,cookie失效.
终于找到了为什么在退出登录时获取不到cookie的原因了.
现在问题又来了,我不能真正实现cookie删除.这个问题网上的解释比较多.
网上说,删除cookie是必须要设置setPath()和setDomain()两个参数.经过亲自测试:我只设置了setPath()就删除了cookie了.
添加cookie时,设置setPath();
删除cookie时,也要设置setPath();
这个问题终于被解决了.
java中使用request.getCookies删除所有cookie
原文地址:http://bingzhe.blog.51cto.com/2389237/1685230