Cookie 历来指就着牛奶一起吃的点心。然而,在因特网内,“Cookie”这个字有了完全不同的意思。那么“Cookie”到底是什么呢?“Cookie”是小量信息,由网络服务器发送出来以存储在网络浏览器上,从而下次这位独一无二的访客又回到该网络服务器时,可从该浏览器读回此信息。这是很有用的,让浏览器记住这位访客的特定信息,如上次访问的位置、花费的时间或用户首选项(如样式表)。Cookie 是个存储在浏览器目录的文本文件,当浏览器运行时,存储在 RAM 中。一旦你从该网站或网络服务器退出,Cookie 也可存储在计算机的硬驱上。当访客结束其浏览器对话时,即终止的所有 Cookie。
Cookie特点
Cookie内存大小受限
空 | IE 6.0 | IE 7.0 8.0 | Opera | Fire Fox | Safari | Chrome |
---|---|---|---|---|---|---|
Cookie个数 | 每个域名下20个 | 每个域名下50个 | 每个域名30个 | 每个域名50个 | 没有限制 | 每个域名53个 |
Cookie大小 | 4095字节 | 4095字节 | 4096字节 | 4097字节 | 4097字节 | 4097字节 |
Cookie具有生命周期
Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了(当然,不排除用户手工删除Cookie)。而还有一些Cookie在用户退出会话的时候就被删除了,这样可以有效保护个人隐私。
Cookie在生成时就会被指定一个Expire值,这就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。有些页面将Cookie的生存周期设置为“0”或负值,这样在关闭浏览器时,就马上清除Cookie,不会记录用户信息,更加安全。
Cookie满足同源策略
虽然网站images.google.com与网站www.google.com同属于Google,但是域名不一样,二者同样不能互相操作彼此的Cookie。
问题来了 举个例子:
访问玩zhidao.baidu.com 再访问wenku.baidu.com还需要重新登陆百度账号吗?
解决办法: 设置document.domain = ‘baidu.com’;
让页面属于这个基础域名下(那么此页面和任何二级域名为baidu.com的)
封装自己Cookie的增删改查函数
/* 2017/02/20 cookie操作 */function setCookie(key, value, iDay) { var oDate = new Date(); oDate.setDate(oDate.getDate() + iDay); document.cookie = key + '=' + value + ';expires=' + oDate; }function removeCookie(key) { setCookie(key, '', -1);//这里只需要把Cookie保质期退回一天便可以删除}function getCookie(key) { var cookieArr = document.cookie.split('; '); for(var i = 0; i < cookieArr.length; i++) { var arr = cookieArr[i].split('='); if(arr[0] === key) { return arr[1]; } } return false; }
SpringMVC与Cookie
@CookieValue的作用
用来获取Cookie中的值
@RequestMapping("/testCookie") public String testCookie(@CookieValue(value="name",required=false) String name, @CookieValue(value="age",required=false) Integer age){ System.out.println(name+","+age); return "hello"; }
通过Request操作Cookie
/** * 读取所有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; } } } }
查看原文: http://www.coder306.cn/?p=176