Cookie知识点总结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cookie知识点总结相关的知识,希望对你有一定的参考价值。
- Cookie机制是采用客户端保持Http状态信息的方案。
- Cookie是在浏览器访问web服务器的某个资源的时候,由web服务器在http响应消息头中附带给浏览器的一个小文本文件。
- 一旦web服务器保存了某个Cookie,那么它在以后每次访问该web服务器的时候都会在http请求头中将这个cookie回传给web服务器。
- 底层实现原理:web服务器通过http响应消息中增加Set_cookie响应头字段将cookie信息发送给服务器,浏览器则通过在http请求消息中增加Cookie请求头字段将cookie回传给web服务器。
- 一个cookie只能标识一种信息,它至少含有一个标识该信息的名称Name和设置值Value。
- 一个web站点可以给一个web浏览器发送多个cookie,一个web浏览器也可以存储多个web站点提供cookie。
- 浏览器一般只允许存放300个cookie,每个站点最多存放20个cookie,每个cookie的大小限制为4kb。
cookie传送流程:
第一次响应返回cookie代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% Cookie cookie = new Cookie("name", "soyoungboy"); response.addCookie(cookie); %> </body> </html>
在浏览器里面观察信息,响应里面有服务器端我刚刚设置的cookie信息:
再次访问会将服务器端返回的cookie携带上:
cookie相关api:
1 设置最大生存时间,以秒为单位:
cookie.setMaxAge(60);
2 指定目录中所有页面以及该目录子目录的所有页面可见,cookie路径必须包含设置cookie的servlet,例如/catalog,它使得cookie对于服务器上的/catalog下的所有目录都是可见的。
cookie.setPath("/test/test2"):
3 设置cookie:
response.addCookie(cookie);
4 读取cookie:
Cookie[] cookies = request.getCookies();
5 删除cookie:
Cookie cookie = new Cookie("key", null);
cookie.setMaxAge(0);
如下内容参考网络上面的资源:https://www.oschina.net/code/snippet_2001568_48014
js实现cookie增删改查
添加cookie:
<script language="javascript" type="text/javascript"> function addCookie(name,value,expiresHours){ var cookieString=name+"="+escape(value); //判断是否设置过期时间,0代表关闭浏览器时失效 if(expiresHours>0){ var date=new Date(); date.setTime(date.getTime+expiresHours*3600*1000); cookieString=cookieString+"; expires="+date.toGMTString(); } document.cookie=cookieString; } </script>
修改cookie:
<script language="JavaScript" type="text/javascript"> function editCookie(name,value,expiresHours){ var cookieString=name+"="+escape(value); //判断是否设置过期时间,0代表关闭浏览器时失效 if(expiresHours>0){ var date=new Date(); date.setTime(date.getTime+expiresHours*3600*1000); //单位是多少小时后失效 cookieString=cookieString+"; expires="+date.toGMTString(); } document.cookie=cookieString; } </script>
获取指定名称的cookie:
<script language="JavaScript" type="text/javascript"> function getCookie(name){ var strCookie=document.cookie; var arrCookie=strCookie.split("; "); for(var i=0;i<arrCookie.length;i++){ var arr=arrCookie[i].split("="); if(arr[0]==name){ return unescape(arr[1]); }else{ return ""; } } } </script>
删除指定的cookie:
<script language="JavaScript" type="text/javascript"> function deleteCookie(name){ var date=new Date(); date.setTime(date.getTime()-10000); //设定一个过去的时间即可 document.cookie=name+"=v; expires="+date.toGMTString(); } </script>
java实现cookie增删改查:
/** * 根据名字获取cookie * @param request * @param name cookie名字 * @return */ public Cookie getCookieByName(HttpServletRequest request,String name){ Map<String,Cookie> cookieMap = ReadCookieMap(request); if(cookieMap.containsKey(name)){ Cookie cookie = (Cookie)cookieMap.get(name); return cookie; }else{ return null; } } /** * 将cookie封装到Map里面 * @param request * @return */ private Map<String,Cookie> ReadCookieMap(HttpServletRequest request){ Map<String,Cookie> cookieMap = new HashMap<String,Cookie>(); Cookie[] cookies = request.getCookies(); if(null!=cookies){ for(Cookie cookie : cookies){ cookieMap.put(cookie.getName(), cookie); } } return cookieMap; }
通过SpringMvc来进行增删改查:
** * 读取所有cookie * 注意二、从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期 * @param request * @param response */ @RequestMapping("/showCookies") public void showCookies(HttpServletRequest request,HttpServletResponse response ){ Cookie[] cookies = request.getCookies();//这样便可以获取一个cookie数组 if (null==cookies) { System.out.println("没有cookie========="); } else { for(Cookie cookie : cookies){ System.out.println("name:"+cookie.getName()+",value:"+ cookie.getValue()); } } } /** * 添加cookie * @param response * @param name * @param value */ @RequestMapping("/addCookie") public void addCookie(HttpServletResponse response,String name,String value){ Cookie cookie = new Cookie(name.trim(), value.trim()); cookie.setMaxAge(30 * 60);// 设置为30min cookie.setPath("/"); System.out.println("已添加==============="); response.addCookie(cookie); } /** * 修改cookie * @param request * @param response * @param name * @param value * 注意一、修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。 */ @RequestMapping("/editCookie") public void editCookie(HttpServletRequest request,HttpServletResponse response,String name,String value){ Cookie[] cookies = request.getCookies(); if (null==cookies) { System.out.println("没有cookie=============="); } else { for(Cookie cookie : cookies){ if(cookie.getName().equals(name)){ System.out.println("原值为:"+cookie.getValue()); cookie.setValue(value); cookie.setPath("/"); cookie.setMaxAge(30 * 60);// 设置为30min System.out.println("被修改的cookie名字为:"+cookie.getName()+",新值为:"+cookie.getValue()); response.addCookie(cookie); break; } } } } /** * 删除cookie * @param request * @param response * @param name */ @RequestMapping("/delCookie") public void delCookie(HttpServletRequest request,HttpServletResponse response,String name){ Cookie[] cookies = request.getCookies(); if (null==cookies) { System.out.println("没有cookie=============="); } else { for(Cookie cookie : cookies){ if(cookie.getName().equals(name)){ cookie.setValue(null); cookie.setMaxAge(0);// 立即销毁cookie cookie.setPath("/"); System.out.println("被删除的cookie名字为:"+cookie.getName()); response.addCookie(cookie); break; } } } }
以上是关于Cookie知识点总结的主要内容,如果未能解决你的问题,请参考以下文章