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自动完成以下步骤

  1. ession的钝化 ===> 在服务器正常关闭之前,将session对象系列化到硬盘上
  2. session的活化 ===> 在服务器启动后,将session文件转化为内存中的session对象即可

注意:

Tomcat 已经将 钝化 和 活化 给完成了(Tomcat 正常关闭前会将当前的 session 数据保存到当前工作目录的 work 目录下的某个文件,再次启动后会读取该 work 目录下保存 session 数据的文件,然后把该文件删除),不需要我们操作;但是 IDEA 集成 Tomcat 时每次重启项目都会删除 work 目录,导致活化失败(钝化是成功的)

3. session什么时候被销毁?

  1. 服务器关闭
  2. session对象调用invalidate()
  3. session默认失效时间 30分钟

可以修改配置文件

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

五、特点

  1. session用于存储一次会话的多次请求的数据,存在服务器端
  2. session可以存储任意类型,任意大小的数据

六、session与Cookie的区别:

  1. session存储数据在服务器端,Cookie在客户端
  2. session没有数据大小限制,Cookie有
  3. session数据安全,Cookie相对于不安全
posted @ 2020-08-18 17:20  IT蓝月  阅读(156)  评论(0编辑  收藏  举报
Live2D