Java第四十二天,会话内容(三),Session(一)
一、概念
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中
二、使用
1.获取对象
HttpServletRequest request = ......
HttpSession session = HttpServletRequest.getSession()
2.常用方法
- Object obj = Session.getAttribute(String name)
- Session.setAttribute(String name, Object value)
- Session.removeAttribute(String name)
3.举例
(1)创建 Session
package web.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet(urlPatterns = {"/first"})
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建 Session 对象
HttpSession session = request.getSession();
// 设置 编码格式,并且告诉浏览器解码格式,防止中文乱码
response.setContentType("text/html;charset=utf-8");
// 将 session 添加到 response 对象中
session.setAttribute("name", "小红");
// 重定向
response.sendRedirect("second");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
(2)获取 Session
package web.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取 session
HttpSession session = request.getSession();
Object name = session.getAttribute("name");
// 设置编码及解码格式
response.setContentType("text/html;charset=utf-8");
// 遍历所有 cookie
response.getWriter().write(name.toString());
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
三、原理
Session的实现是依赖于Cookie的
四、细节
1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
默认情况下,不是
如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(存活时间);
response.addCookie(cookie);
2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
不是同一个,但是要确保数据不丢失,tomcat自动完成以下步骤
- ession的钝化 ===> 在服务器正常关闭之前,将session对象系列化到硬盘上
- session的活化 ===> 在服务器启动后,将session文件转化为内存中的session对象即可
注意:
Tomcat 已经将 钝化 和 活化 给完成了(Tomcat 正常关闭前会将当前的 session 数据保存到当前工作目录的 work 目录下的某个文件,再次启动后会读取该 work 目录下保存 session 数据的文件,然后把该文件删除),不需要我们操作;但是 IDEA 集成 Tomcat 时每次重启项目都会删除 work 目录,导致活化失败(钝化是成功的)
3. session什么时候被销毁?
- 服务器关闭
- session对象调用invalidate()
- session默认失效时间 30分钟
可以修改配置文件
<session-config>
<session-timeout>30</session-timeout>
</session-config>
五、特点
- session用于存储一次会话的多次请求的数据,存在服务器端
- session可以存储任意类型,任意大小的数据
六、session与Cookie的区别:
- session存储数据在服务器端,Cookie在客户端
- session没有数据大小限制,Cookie有
- session数据安全,Cookie相对于不安全