package com.demo.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
/*
Session 技术:
1、引入:
Cookie 的局限:
1)、Cookie 只能存字符串,不能存对象;
2)、Cookie 不能存中文数据;
3)、一个 cookie 的数据不能超过 4KB;
如果要存储超过 4KB的数据,或者存储中文数据,或者存储对象数据,就只能用 session 技术;
Session 的特点:会话数据保存在服务器端(内存中);
2、Session 技术的核心:HttpSession类,通过此类对会话数据进行存储;
1)、创建或的到 session 对象:通过请求对象 request 得到 session 对象;
HttpSession request.getSession(); // 得到或创建对象
HttpSession request.getSession(boolean create); // 如果参数为true,和无参的 getSession() 一样,得到或创建对象;
// 如果参数为false,只能用来得到session对象,如果没有匹配的session编号,则返回null;
2)、设置 session 对象:
void setMaxInactiveInterval(int interval); // 设置 session 的有效时间
void invalidate(); // 销毁 session 对象
String getId(); // 得到 session 编号
3)、存取会话数据
void setAttribute(String name, Object value); // 保存数据
Object getAttribute(String name); // 获取数据
void removeAttribute(String name); // 清除数据
3、Session 的原理:
HttpSession session = request.getSession():创建(获取) session 对象解析:
1)、浏览器第一次访问服务器时,request.getSession() 方法会创建 session 对象,并给 session 对象
分配一个唯一的 ID,叫做 JSESSIONID;服务器端把 JSESSIONID 作为 cookie 的值发送给浏览器端保存;
2)、第二次访问的时候,浏览器带着 JSESSIONID 的 cookie 访问服务器,服务器得到 JSESSIONID,在服务器
的内存中搜索是否存在对应编号的 session 对象;如果找到对应编号的 session 对象,request.getSession()
方法直接返回该对象;如果找不到对应编号的 session 对象,则创建新的 session 对象,继续走 1) 的流程;
*/
@WebServlet(name = "SessionDemo1", value = "/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
/*
保存会话数据到 session 域对象;
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1、创建(获取) session 对象
HttpSession session = request.getSession();
// 得到 session 编号:JSESSIONID 的值
String id = session.getId();
System.out.println("JSESSIONID:" + id);
// 设置 session 的有效时间
// 关闭浏览器时,session 对象依然存在,因为 session 对象是在服务器中的;
// 默认情况下,session 对象的存在时间为 30分钟,30分钟后服务器自动回收;
// session.setMaxInactiveInterval(20); // 设置 session 的有效时间为 20秒,20秒后服务器自动回收 session 对象;
/*
还可以在 web.xml 中设置 session 对象的全局有效时间,对服务器中的所有 session 对象都有效;
<session-config>
<session-timeout>5</session-timeout> // 注意:此处设置时间以 分钟 为单位,此设置为 5分钟;
</session-config>
*/
// 默认情况下,发送到浏览器的 JSESSIONID 是会话级别的,浏览器关闭,则 JSESSIONID 消失;
// 为了使浏览器关闭以后 JSESSIONID 还继续存在,我们可以手动设置 JSESSIONID 的有效时间;
Cookie cookie = new Cookie("JSESSIONID", session.getId()); // JSESSIONID 的值就是 session 的编号
cookie.setMaxAge(60 * 5); // 设置 JSESSIONID 的有效时间为 5分钟
response.addCookie(cookie);
// 2、保存会话数据到 session 对象
session.setAttribute("name", "rose");
System.out.println("保存数据成功");
}
}
package com.demo.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "SessionDemo2", value = "/SessionDemo2")
public class SessionDemo2 extends HttpServlet {
/*
从 session 域对象中取出会话数据
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1、创建(获取) session 对象
HttpSession session = request.getSession();
// 得到 session 编号:JSESSIONID 的值(必须和保存数据的 JSESSIONID 的值一样才能取出数据)
String id = session.getId();
System.out.println("JSESSIONID:" + id);
// 2、从 session 对象中取出数据
String name = (String)session.getAttribute("name");
System.out.println("name=" + name);
}
}
package com.demo.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "DeleteSession", value = "/DeleteSession")
public class DeleteSession extends HttpServlet {
/*
手动销毁 session 对象
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1、得到 session 对象
HttpSession session = request.getSession(false);
if (session == null){
System.out.println("session 对象不存在");
return ;
}
// 销毁 session 对象
session.invalidate();
System.out.println("session销毁成功");
}
}