码迷,mamicode.com
首页 > 编程语言 > 详细

java中使用request.getCookies删除所有cookie

时间:2015-08-17 19:53:33      阅读:436      评论:0      收藏:0      [点我收藏+]

标签:java cookie 删除

今天在处理一个删除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

标签:java cookie 删除

原文地址:http://bingzhe.blog.51cto.com/2389237/1685230

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!