服务器端会话技术,在一次会话的多次请求间共享数据,将数据存储在服务器,HttpSession;
//1、获取session
HttpSession session = req.getSession();
HttpSession getSession();
//2、为session设置数据
session.setAttribute("msg","Hello Session!");
void setAttribute(String name, Object obj);
//3、使用Session获取数据
Object msg = session.getAttribute("msg");
Object getAttribute(String name);
//4、移除数据
session.removeAttribute("msg");
void removeAttribute(String name);
MyServlet:
package com.zibo.servlet;
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("/my")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet……");
System.out.println("转到doPost……");
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost……");
//1、获取session
HttpSession session = req.getSession();
//2、为session设置数据
session.setAttribute("msg","Hello Session!");
//3、使用Session获取数据
Object msg = session.getAttribute("msg");
//4、移除数据
session.removeAttribute("msg");
}
}
SecondServlet:
package com.zibo.servlet;
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("/s1")
public class SecondServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、获取Session
HttpSession session = req.getSession();
//2、使用Session获取数据
Object msg = session.getAttribute("msg");
System.out.println(msg);
}
}
服务器如何在一次会话范围内,多次获取的Seesion对象是同一个;
Session的实现依赖于Cookie;
第一步:浏览器向服务器发送请求,服务器第一次获取Session,没有Cookie,服务器会在内存中创建一个新的Seeion对象,并通过Cookie的方式将该Session对象的id传给客户端;
第二步:客户端再次向服务器发送请求,会携带Cookie数据,Cookie包含了Session对象的id,服务器通过Session对象的id找到对应的Session对象;
本质上是使用Cookie,设置存活时间,下次服务器获取Session对象的时候,根据Cookie获取而不是创建新的,服务器发送的Cookie信息内包含的Session对象的ID也是原来的Session对象的ID;
package com.zibo.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/my")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet……");
System.out.println("转到doPost……");
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost……");
//1、获取session
HttpSession session = req.getSession();
//2、为session设置数据
session.setAttribute("msg","Hello Session!");
//3、手动发Cookie
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(60*60);
resp.addCookie(cookie);
}
}
session的钝化:
在服务器正常关闭之前,将session对象序列化到硬盘上保存;
session的活化:
在服务器启动后,将session文件转化为内存中的session对象(反序列化)即可;
①服务器被正常关闭,session对象被销毁;
②session调用invalidate()方法,session对象被销毁;
③session默认失效时间是30分钟,可以更改这个时间;
<session-config>
<session-timeout>30</session-timeout>
</session-config>
1、session是用于存储一次会话的多次请求间的数据,存放在服务器端;
2、session可以存储任意类型、任意大小的数据;
①Session存储数再服务器端,Cookie存储数据在客户端;
②Session没有数据大小的限制,Cookie有;
③Session安全,Cookie相对不安全;