Session

引入
Cookie的局限

  1. Cookie只能保存字符串类型,不能保存对象。
  2. 只能存非中文
  3. 一个Cookie的容量不能超过4KB
    如果要保存非字符串,超过4KB的内容,只能使用Session

Session特点:会话数据保存到服务器端。(内存中)
Session核心技术
HttpSession类:用于保存会话数据

  1. 创建或者得到Session对象
HttpSession getSession() 
HttpSession getSession(boolean create) 
  1. 设置session对象
    设置session有效时间
void setMaxInactiveInterval(int interval) 

销毁session对象

void invalidate() 

得到session编号

java.lang.String getId() 
  1. 保存会话数据到session对象中
    保存数据
 void setAttribute(java.lang.String name, java.lang.Object value) 

获取数据

java.lang.Object getAttribute(java.lang.String name)  

清除数据

void removeAttribute(java.lang.String name) 

Session原理
问题:服务器能够识别不同的浏览器
步骤一:浏览器1:创建session对象,保存会话数据
步骤二:浏览器1新窗口:得到session会话数据
重复步骤二:新的浏览器访问无法得到session会话数据

代码解读:HttpSession session = request.getSession();

  1. 创建session对象,给session对象分配唯一ID,叫JSESSIONID
new Httpsession();```
2. 把JSESSIONID作为Cookie的值发给浏览器保存

Cookie cookie = new Cookie("JSESSIONID","sessionID");
response.addCookie(cookie);```

  1. 第二次访问的时候,浏览器带着JSESSIONID的Cookie访问服务器
  2. 服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象(例如,map对象)
if(找到){
return map.get(sessionID);
}
Map
例如:Map对象结构:
<"s001",s1>
<"s002",s2>
  1. 如果找到 对应编号的session对象 ,直接返回该对象
  2. 如果找不到对应的session对象,就会创建新的session对象,继续走1.的流程
    结论:通过JSESSION的cookie值在服务器中找session对象

Session细节

  1. 得到session编号
java.lang.String getId()```
2. 两个getSession对象

getSession()/getSession(true) ```
        创建或者得到session对象。没有匹配的session编号,自动创建新的session对象。

getSession(false)```
        得到session对象。没有匹配的session编号,返回null。
3. 设置session的有效时间

void setMaxInactiveInterval(int interval)```
session对象销毁时间:1.默认情况30分钟服务器自动回收
                                      2.修改回收时间
                                      3.全局修改session有效时间


    
        1
    ```
                                      4.手动销毁session对象

void invalidate()```
                                      5.如何避免浏览器的JESSIONID的cookie随着浏览器关闭而丢失的问题

Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);```

你可能感兴趣的:(Session)