为什么要有cookie
当用户在发送一个请求关得到返回信息之后,客户端与服务器端之间的网络连接就已经
断开了,在下一个请求发送时,服务器无法确定这次请求和上次的请求是否来自同一个客
户端。也就是说,服务器不能记住"记住"用户,这是hptp协议的限制。在web应用程序中,
实际上是经常需要记住每次请求的。那么,如何让服务器知道不同的请求是否来自同一个
客户端,就是状态管理问题出现了session和cookie
状态管理
分为客户端和服务器端
服务器端:状态信息保存在服务器端,session (其它:Application,HttpContext,Cache
)
客户端:状态信息保存在客户端,cookie (QueryString,ViewState,ControlState,隐藏域
)
当客户端向服务器发送请求时,状态信息也随之发送到服务端,从而起到验证客户端来路
的目的。
客户端状态不如服务器端的安全性和可靠性高,但服务器端状态会占用服务器端资源,影
响服务器性能。
Session session超过之前 数据大小不限,建议数据尽量少
cookie 可编程控制 数据受cookie大小限制
具体来说cookie机制采用的是在客户端保持状态的方案。它是在用户端的会话状态的存贮
机制,他需要用户打开客户端的cookie支持。
而session机制采用的是一种在客户端与服务器之间保持状态的解决方案。同时我们也看到
,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能
需要借助于cookie机制来达到保存标识的目的。而session提供了方便管理全局变量的方式
session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个
用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用
cookie时,这个值也可能设置为由get来返回给服务器。
就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,
建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。
正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行
特殊的指示以提示浏览器按照指示生成相应的cookie
从网络服务器观点看所有HTTP请求都独立于先前请求。就是说每一个HTTP响应完全依赖于
相应请求中包含的信息
状态管理机制克服了HTTP的一些限制并允许网络客户端及服务器端维护请求间的关系。在
这种关系维持的期间叫做会话(session)。
Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。IETF
RFC 2965 HTTP State Management Mechanism 是通用cookie规范。网络服务器用HTTP头向
客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件
,它会自动将同一服务器的任何请求缚上这些cookies
二:cookie使用
1、创建一个新的Cookie
Cookie cookie = new Cookie("username",name);
2、设置cookie在客户端上存活多久
cookie.setMaxAge(30*60);
3、把cookie发送到客户
response.addCookie(cookie);
4、从客户请求得到cookie(或多个cookie)
Cookie[] cookies=request.getCookies();
for(int i=0-;i<cookies.length;i++){
Cookie cookie=cookies[i];
out.println(cookie.getName()+":"+cookie.getValue())
}
五:cookieUtil的使用
1 package com.channel.sys.common.utils; 2 3 import java.io.UnsupportedEncodingException; 4 import java.net.URLDecoder; 5 import java.net.URLEncoder; 6 7 import javax.servlet.http.Cookie; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 /** 12 * Cookie工具类 13 * @author ThinkGem 14 * @version 2013-01-15 15 */ 16 public class CookieUtils { 17 18 /** 19 * 设置 Cookie(生成时间为1天) 20 * @param name 名称 21 * @param value 值 22 */ 23 public static void setCookie(HttpServletResponse response, String name, String value) { 24 setCookie(response, name, value, 60*60*24); 25 } 26 27 /** 28 * 设置 Cookie 29 * @param name 名称 30 * @param value 值 31 * @param maxAge 生存时间(单位秒) 32 * @param uri 路径 33 */ 34 public static void setCookie(HttpServletResponse response, String name, String value, String path) { 35 setCookie(response, name, value, path, 60*60*24); 36 } 37 38 /** 39 * 设置 Cookie 40 * @param name 名称 41 * @param value 值 42 * @param maxAge 生存时间(单位秒) 43 * @param uri 路径 44 */ 45 public static void setCookie(HttpServletResponse response, String name, String value, int maxAge) { 46 setCookie(response, name, value, "/", maxAge); 47 } 48 49 /** 50 * 设置 Cookie 51 * @param name 名称 52 * @param value 值 53 * @param maxAge 生存时间(单位秒) 54 * @param uri 路径 55 */ 56 public static void setCookie(HttpServletResponse response, String name, String value, String path, int maxAge) { 57 Cookie cookie = new Cookie(name, null); 58 cookie.setPath(path); 59 cookie.setMaxAge(maxAge); 60 try { 61 cookie.setValue(URLEncoder.encode(value, "utf-8")); 62 } catch (UnsupportedEncodingException e) { 63 e.printStackTrace(); 64 } 65 response.addCookie(cookie); 66 } 67 68 /** 69 * 获得指定Cookie的值 70 * @param name 名称 71 * @return 值 72 */ 73 public static String getCookie(HttpServletRequest request, String name) { 74 return getCookie(request, null, name, false); 75 } 76 /** 77 * 获得指定Cookie的值,并删除。 78 * @param name 名称 79 * @return 值 80 */ 81 public static String getCookie(HttpServletRequest request, HttpServletResponse response, String name) { 82 return getCookie(request, response, name, true); 83 } 84 /** 85 * 获得指定Cookie的值 86 * @param request 请求对象 87 * @param response 响应对象 88 * @param name 名字 89 * @param isRemove 是否移除 90 * @return 值 91 */ 92 public static String getCookie(HttpServletRequest request, HttpServletResponse response, String name, boolean isRemove) { 93 String value = null; 94 Cookie[] cookies = request.getCookies(); 95 if (cookies != null) { 96 for (Cookie cookie : cookies) { 97 if (cookie.getName().equals(name)) { 98 try { 99 value = URLDecoder.decode(cookie.getValue(), "utf-8"); 100 } catch (UnsupportedEncodingException e) { 101 e.printStackTrace(); 102 } 103 if (isRemove) { 104 cookie.setMaxAge(0); 105 response.addCookie(cookie); 106 } 107 } 108 } 109 } 110 return value; 111 } 112 }
1 /** 2 * Created by zhanglw6 on 2017/11/30. 3 */ 4 define('app/jsp/common/documentCookie', function (require, exports, module) { 5 var $=require('jquery'); 6 7 8 function getCookieInner(name)//供内部调用 9 { 10 var arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)")); 11 if (arr != null) 12 return unescape(arr[2]); 13 return null; 14 } 15 16 //构造并存储cookie 17 exports.setCookie=function(name, value)// 两个参数,一个是cookie的名子,一个是值 18 { 19 var Days = 30; // 此 cookie 将被保存 30 天 20 var exp = new Date(); // new Date("December 31, 9998"); 21 exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000); 22 document.cookie = name + "=" + escape(value) + ";expires=" 23 + exp.toGMTString(); 24 }, 25 26 //从cookie中取出一个参数 27 exports.getCookie=function(name)// 取cookies函数 28 { 29 var arr = document.cookie 30 .match(new RegExp("(^| )" + name + "=([^;]*)(;|$)")); 31 if (arr != null) 32 return unescape(arr[2]); 33 return null; 34 35 } 36 37 //删除coolie 38 exports.delCookie=function(name) 39 { 40 var exp = new Date(); 41 exp.setTime(exp.getTime() - 1); 42 var cval = getCookieInner(name); 43 if (cval != null) 44 document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString(); 45 } 46 47 48 });