一 概念
服务器端会话技术 在一次会话的多次请求间共享数据 将数据保存在服务器端的对象HttpSession中
二 快速入门
2.1 HttpSession对象的常用方法
获取HttpSession对象
使用HttpSession对象
SessionDemo1
package Session;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//使用session共享数据
//1.获取session
HttpSession session = req.getSession();
//2.存储数据
session.setAttribute("msg","kong");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
SessionDemo2
package Session;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author shijiu
*/
@WebServlet("/SessionDemo2")
public class SessionDemo2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//使用session获取数据
//1.获取session
HttpSession session = req.getSession();
//2.获取数据
Object msg = session.getAttribute("msg");
System.out.println(msg);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
三 原理
Session的实现是依赖于Cookie的
浏览器第一次请求服务器 服务器创建一个session对象 服务器第一次响应时 回加一个响应头set-cookie 浏览器会将cookie保存
第二次请求服务器时 会带着cookie访问 这时服务器就知道两次请求时是同一个会话 可以将数据保存到一个共有的session对象中
四 细节
1.当客户端(浏览器)关闭后 服务端不关闭 两次获取session是否为同一个?
默认情况下不是同一个
如果希望客户端关闭后 session也能相同
采用如下方式
创建cookie 设置属性
因为本身就是靠cookie传递的嘛 也就是说 只要每次请求传递的cookie符合条件 这些请求就可以看做是一次会话 可以共用一个session保存共有数据
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//使用session获取数据
//1.获取session
HttpSession session = req.getSession();
//期待客户端关闭后 session也能相同
Cookie cookie = new Cookie("JSESSIONID", session.getId());
//存活时间
cookie.setMaxAge(60*60);
resp.addCookie(cookie);
System.out.println(session);
}
2.客户端不关闭 服务器关闭后 两次获取的session是同一个吗?
不是同一个 但是要保证数据不丢失
-
session的钝化
-
在服务器正常关闭之前 将session对象序列化到硬盘上
-
-
session的活化
-
服务器启动后 将session文件转化为内存中的session对象即可
-
3.session什么时候被销毁
-
服务器关闭
-
session对象调用invalidate方法
-
默认失效时间30min
五 特点
-
session用于存储一次会话的多次请求的数据 存在服务器端
-
session可以存储任意类型 任意大小的数据
session与cookie的区别
-
session存数据在服务器端 cookie在客户端
-
session没有数据大小限制 cookie有
-
session数据安全 cookie相对于不安全