一、Session快速入门
1、概念
服务器端会话技术,在一次会话的多次请求间共享数据,将数据存储在服务器,HttpSession;
2、快速入门
获取HttpSession对象
//1、获取session
HttpSession session = req.getSession();
HttpSession getSession();
使用HttpSession对象
//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);
}
}
3、原理分析
服务器如何在一次会话范围内,多次获取的Seesion对象是同一个;
Session的实现依赖于Cookie;
原理分析:
第一步:浏览器向服务器发送请求,服务器第一次获取Session,没有Cookie,服务器会在内存中创建一个新的Seeion对象,并通过Cookie的方式将该Session对象的id传给客户端;
第二步:客户端再次向服务器发送请求,会携带Cookie数据,Cookie包含了Session对象的id,服务器通过Session对象的id找到对应的Session对象;
二、Session细节
1、客户端关闭,服务器不关闭,两次获取的Session对象是同一个吗
答:默认情况下,不是!因为服务器创建了两次Session(ID不一样的);
实现客户端关闭后Session也能相同:
本质上是使用Cookie,设置存活时间,下次服务器获取Session对象的时候,根据Cookie获取而不是创建新的,服务器发送的Cookie信息内包含的Session对象的ID也是原来的Session对象的ID;
代码示例:(手动发Cookie)如下是MyServlet代码,SecondServlet见上面代码;
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);
}
}
2、客户端不关闭,服务器关闭,两次获取的Session对象是同一个吗
答:不是同一个;因为服务器关闭,内存释放,内存中的Session对应也被释放了;
但可以确保数据不丢失:
session的钝化:
在服务器正常关闭之前,将session对象序列化到硬盘上保存;
session的活化:
在服务器启动后,将session文件转化为内存中的session对象(反序列化)即可;
Tomcat可以自动完成这件事情!
但是IDEA部署项目只能完成钝化,因为在IDEA启动Tomcat服务器的时候,会将work目录删除,再重新生成新的work目录,但不包含Session钝化的文件,那么原work目录下存放的Session钝化的文件,被删除了,无法读取到;不必担心,真正做项目的时候不要IDEA部署;
3、Session的什么时候被销毁
三种情况:
①服务器被正常关闭,session对象被销毁;
②session调用invalidate()方法,session对象被销毁;
③session默认失效时间是30分钟,可以更改这个时间;
更改session默认失效时间:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
三、Session的特点
1、session是用于存储一次会话的多次请求间的数据,存放在服务器端;
2、session可以存储任意类型、任意大小的数据;
3、Session与Cookie的三大区别
①Session存储数再服务器端,Cookie存储数据在客户端;
②Session没有数据大小的限制,Cookie有;
③Session安全,Cookie相对不安全;