• 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相对于不安全
    作者:蓝月

    -------------------------------------------

    个性签名:能我之人何其多,戒骄戒躁,脚踏实地地走好每一步

  • 相关阅读:
    C# 分布式自增ID算法snowflake(雪花算法)
    C# DateTime日期格式化
    HTTP响应状态码参考
    VS2019已还原ReSharper的功能
    2019前端UI框架排行榜
    2019年ASP.NET Core学习路线
    jumpserver堡垒机安装
    Linux shell 时间操作(取昨天 前天)
    nfs共享文件搭建
    zabbix agent配置详解(windows)
  • 原文地址:https://www.cnblogs.com/viplanyue/p/13573676.html
Copyright © 2020-2023  润新知