今天在处理一个删除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();
这个问题终于被解决了.