首先明白一个概念,会话技术。会话:一次会话中包含多次请求和响应。

*一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
功能:在一次会话的范围内的多次请求间,共享数据

 

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();
}