java中使用request.getCookies删除所有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();

这个问题终于被解决了.

时间: 2024-11-08 09:43:46

java中使用request.getCookies删除所有cookie的相关文章

Java中ArrayList问题:删除一个ArrayList中的重复元素,注意留意一个问题

该问题有两种方法: 一 利用两个数组,此法简单,不讨论 二 利用一个数组,从第0个开始依次取元素,并在其后元素中查找是否有该元素,有则删掉后面的重复元素,依次遍历.---但是这种情况要特别注意,当后续元素中有连续的重复元素时,如不加上y--使y(待比较的后续元素)回退一个,很可能会因为我们删掉当前重复元素y后其后的连续重复元素顶上,导致忽略掉顶上的重复元素. 代码如下: 1 public static void main(String[] args) { 2 ArrayList array=ne

Java 中的 request 和response 区别

1.response 属于重定向请求: 其地址栏的URL会改变: 会向服务器发送两次请求: 2. request 属于请求转发: 其地址栏的URL不会改变: 向服务器发送一次请求: 举一个区分它们的简单实例: A向B借钱: 第一种:用response.B没有钱,请求失败,但是B告诉A,C有钱.于是A再次向C借钱,C借给A,请求成功. 第二种:用request.B没有钱,但是B向C借钱然后给A,请求成功.这次A只发送了一次请求,他并不知道借的钱是C的. 用response方法是这样的: respo

java中通过request获取路径中的不同信息

aa为工程中的项目名 bb为webRoot下的文件夹 1.request.getContextPath(); 输出结果:/aa 2.request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path; 输出结果:http://localhost:8080/aa 3.request.getServletPath();(获取客户端请求文件的路径)输出结果:/bb/conte

Java中创建,获取和删除cookie

创建: Cookie cookie = new Cookie("Cookie",value);//创建名为Cookie的cookie设置参数 cookie.setMaxAge(30*24*60*60); //设置有效时间30天 cookie.setPath(request.getContextPath()); // 设置cookie有效路径 response.addCookie(cookie); 获取(也可以在js中使用<%代码%>): Cookie cookies[] =

JAVA中如何读写COOKIE

Java中删除cookie Cookie[] cookies=request.getCookies(); //cookies不为空,则清除 if(cookies!=null) { String value=cookies[0].getName(); //查找用户名 if(value.equals("userName")) { cookies[0].setMaxAge(0); response.addCookie(cookies[i]); } } Java中如何读写cookie //写c

java中Cookie使用问题(message:invalid character [32] was present in the Cookie value)

1. 问题描述 Servlet中执行下面一段代码: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); System.out.println( new Date().toString()); Cookie c

Java中的会话Cookie&amp;&amp;Session

会话技术 会话: 一次会话中包含多次请求和响应. 一次会话:浏览器第一次给服务器资源发送请,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求之间共享数据 方式: 客户端会话技术:cookie 服务器端和会话技术:session cookie: 概念: 客户端会话技术,将数据保存在客户端 快速入门: 使用步骤 创建cookie对象,绑定数据 new Cookie(String name,String value) 发送cookie对象 response.addCookie(Cook

在java中删除数组元素的练习

有一个有序整数数组,要求输入一个数字,在数组中查找是否有这个数,如果有,将该数作为最后一个元素(其他元素仍然有序):如果没有,则显示“数组中没有这个数!” public static void main(String[] args) { int[] m={1,2,3,4,5,6,7,8,9,10}; System.out.println("请输入一个整数:"); Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int ind

java web中的request和respone

response和request ------------------ 服务器处理请求的流程: 服务器每次收到请求时,都会为这个请求开辟一个新的线程. 服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载体!(袋子) 服务器还会创建response对象,这个对象与客户端连接在一起,它可以用来向客户端发送响应.(手机) ------------------ response:其类型为HttpServletResponse ServletResponse-->与协议无