session技术
4.1 引入
cookie的局限:
1.cookie只能存字符串类型,不呢个保存对象
2.只能存非中文
3.一个cookie的容量不能超过4kb
如果要保存非字符串,超过4kb的技术,只能使用session技术
session特点:
会话数据保存在服务器端(内存中)
4.2 session技术的核心
HttpSession类:用于保存会话数据
1.创建或者得到session对象
HttpSession getSession();
Httpsession getSession(boolean create)
2.设置session对象
setMaxInactiveInterval(int interval):设置session的有效时间
invalidate():销毁session对象
getId():得到session的编号
3.保存会话数据到session对象中
setAttribute():保存数据(域对象有的方法)
getAttribute(): 获取数据
removeAttribute(): 清除数据
4.3 session原理
问题:服务器可以识别不同的浏览者
现象:
浏览器1:1.创建session对象,保存会话数据
1 package com.java.session; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 import javax.servlet.http.HttpSession; 9 /** 10 * 保存数据到session域对象 11 * @author syousetu 12 * 13 */ 14 public class SessionDemo extends HttpServlet { 15 16 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 17 //1.创建session对象 18 HttpSession session = request.getSession(); 19 //2.保存数据 20 session.setAttribute("name", "rose"); 21 22 response.sendRedirect(request.getContextPath()+"/SessionDemo2"); 23 } 24 25 26 }
浏览器1:2.得到session中的对象
1 package com.java.session; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 import javax.servlet.http.HttpSession; 10 11 /** 12 * 从session域对象中取出数据 13 * 14 * @author syousetu 15 * 16 */ 17 public class SessionDemo2 extends HttpServlet { 18 protected void doGet(HttpServletRequest request, HttpServletResponse response) 19 throws ServletException, IOException { 20 21 // 1.得到session对象 22 HttpSession session = request.getSession(); 23 String value = (String) session.getAttribute("name"); 24 System.out.println(value); 25 26 } 27 28 }
新的浏览器1:
2.得到session中的数据:
拿不到数据
新的浏览器2:
2.得到session中的数据
拿不到数据
取到数据的前提:在哪个域对象保存数据,就必须从哪个域对象取出
得到了一个session,就给session分配了一个标记
请求头和响应头中所带的信息
代码解读:HttpSession session = request.getSession();
1.创建一个session对象,给session对象分配一个唯一的id,叫JSESSIONID
new HttpSession()
2.将ISESSIONID作为cookie的值发送给浏览器保存
Cookie cookie = new Cookie("JSESSIONID",sessionID)
response.addCookie(cookie)
3.第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器
4.服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象
if((map.get(sessionID))){
return map.get(sessionID)
}
5.如果找到对应编号的session对象,直接返回该对象
6.如果找不到对应编号的session对象,创建新的session对象,继续走1的流程
结论:通过JSESSION的cookie值在服务器找session对象
4.4:session细节
1. getID():得到session的编号
2. 两个getsession的方法
getSession(true)/getSession():创建或得到session对象。没有匹配的session编号,自动创建新的session对象
getsession(false):只是得到session对象,如果没有匹配的,直接返回null
3. setMaxinactiveInterva(int interval):设置session的有效时间 秒数
(关闭浏览器,session还在)
session对象销毁时间:
1.默认情况下:30分钟服务器自动回收
2.可以在web.xml中修改session的全局有效时间,按分钟计算,最小1分钟
<session-config>
<session-timeout>1</session-timeout>
</sesison-config>
3.修改session回收时间
4.手动销毁session对象
invalidate() :手动销毁session对象
(关掉浏览器后拿不到session,是因为session还在,但是浏览器中的标记没了,证明标记session的cookie是存放在浏览器内存中的 如想关掉浏览器仍然可以拿到session,则需要修改session的MaxAge,设为正数,保存在硬盘中)
总结:
1.会话管理:浏览器和服务器会话过程中产生的会话数据的管理
2.Cookie技术:
new Cookie("name","value")
response.addCookie(cookie)
request.getCookies();
3.Session技术
request.getSession()
setAttribute("name",会话数据)
getAttribute("会话数据")