首先明白一个概念,会话技术。会话:一次会话中包含多次请求和响应。
*一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
功能:在一次会话的范围内的多次请求间,共享数据
Cookie Session 即为客户端和服务器端对应的会话技术
不同点如下
cookie本质保存在客户机中的简单的文本文件, 保存了该客户机访问这个Web 文档时的信息
Session是在服务端使用的一种数据结构,是一个抽象概念,用于记录客户端状态,而cookie是实际存在的文件
cookie数据保存在客户端,session数据保存在服务器端
session 实现依赖于cookie实现,想要在两个session进行通信,需要一个类似通行证进行沟通,这就需要cookie实现,在cookie定义sessionid,在http通信服务端客户端就可知道session对话
session对照身份使用表结构对照通信的id进行通信。
Session 实现用哈希表(key-value键值对) 而Cookie 使用http表头。
session对于数据大小比cookie限制要少,cookie翻译为小甜点,看名字就知道不是大数据量存储。浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)
session(主菜)要比cookie安全性要高
//session与cookie关联案例 Cookie ck = new Cookie("SESSIONID",session.getId()); ck.setMaxAge(60*60);//设置生命周期 response.addCookie(ck);
以下为源码
Cookie源码
package javax.servlet.http; import java.io.Serializable; import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; public class Cookie implements Cloneable, Serializable { private static final long serialVersionUID = -6454587001725327448L; private static final String TSPECIALS; private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings"; private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings"); private String name;//Cookie的名称 private String value;//Cookie的值 private String comment;//说明 private String domain;//cookie域名,对于跨网站对话有关 private int maxAge = -1;//cookie的寿命,单位秒,正数为寿命时间,0代表立即关闭,负数代表临时开启,关闭浏览器即失效
private boolean secure;//安全协议传输是否 private int version = 0;//版本
private boolean isHttpOnly = false; public Cookie(String name, String value) { if (name != null && name.length() != 0) { if (this.isToken(name) && !name.equalsIgnoreCase("Comment") && !name.equalsIgnoreCase("Discard") && !name.equalsIgnoreCase("Domain") && !name.equalsIgnoreCase("Expires") && !name.equalsIgnoreCase("Max-Age") && !name.equalsIgnoreCase("Path") && !name.equalsIgnoreCase("Secure") && !name.equalsIgnoreCase("Version") && !name.startsWith("$")) { this.name = name; this.value = value; } else { String errMsg = lStrings.getString("err.cookie_name_is_token"); Object[] errArgs = new Object[]{name}; errMsg = MessageFormat.format(errMsg, errArgs); throw new IllegalArgumentException(errMsg); } } else { throw new IllegalArgumentException(lStrings.getString("err.cookie_name_blank")); } } public void setComment(String purpose) { this.comment = purpose; } public String getComment() { return this.comment; } public void setDomain(String domain) { this.domain = domain.toLowerCase(Locale.ENGLISH); } public String getDomain() { return this.domain; } public void setMaxAge(int expiry) { this.maxAge = expiry; } public int getMaxAge() { return this.maxAge; } public void setPath(String uri) {//设置cookie的获取范围,共享可以改成“/” this.path = uri; } public String getPath() { return this.path; } public void setSecure(boolean flag) { this.secure = flag; } public boolean getSecure() { return this.secure; } public String getName() { return this.name; } public void setValue(String newValue) { this.value = newValue; } public String getValue() { return this.value; } public int getVersion() { return this.version; } public void setVersion(int v) { this.version = v; } private boolean isToken(String value) { int len = value.length(); for(int i = 0; i < len; ++i) { char c = value.charAt(i); if (c < ‘ ‘ || c >= 127 || TSPECIALS.indexOf(c) != -1) { return false; } } return true; } public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException var2) { throw new RuntimeException(var2.getMessage()); } } public void setHttpOnly(boolean isHttpOnly) { this.isHttpOnly = isHttpOnly; } public boolean isHttpOnly() { return this.isHttpOnly; } static { if (Boolean.valueOf(System.getProperty("org.glassfish.web.rfc2109_cookie_names_enforced", "true"))) { TSPECIALS = "/()<>@,;:\\\"[]?={} \t"; } else { TSPECIALS = ",; "; } } }
//HttpSession源码 太懒了写注释 名字就是这个意思 有空补充
package javax.servlet.http; import java.util.Enumeration; import javax.servlet.ServletContext; public interface HttpSession { long getCreationTime(); String getId(); long getLastAccessedTime(); ServletContext getServletContext(); void setMaxInactiveInterval(int var1); int getMaxInactiveInterval(); /** @deprecated */ @Deprecated HttpSessionContext getSessionContext(); Object getAttribute(String var1); /** @deprecated */ @Deprecated Object getValue(String var1); Enumeration<String> getAttributeNames(); /** @deprecated */ @Deprecated String[] getValueNames(); void setAttribute(String var1, Object var2); /** @deprecated */ @Deprecated void putValue(String var1, Object var2); void removeAttribute(String var1); /** @deprecated */ @Deprecated void removeValue(String var1); void invalidate(); boolean isNew(); }