• Session会话追踪的实现机制


    一、会话技术

            客户端和服务器通信的过程中,自然而然的会产生一些数据交互。比如,A用户登录了邮箱,那么web服务器该怎么知道C一段时间后的登录状态呢?虽然HttpServletRequest对象和ServletContext对象都可以保存数据,但是不适用于这种情况。

    • 客户端的每次请求,服务器都会产生一个HttpServletRequest对象,该对象只保存请求所传递的数据。
    • 用一个WEB应用共享一个ServletContext对象,所以当多个用户登录时就有可能会造成数据混淆。

            当浏览器向ServletB发出请求时,它的登陆操作已经完成了,但是却没有留下任何依据能够证明它已经成功登陆。以至于ServletB对他的登陆状态无法判别,这种情况叫用户状态的丢失。造成这种结果的原因是http协议的无状态;
            为了解决这个问题,Servlet提供了会话跟踪技术来追踪用户状态,简单的说就是指将用户操作过的重要业务步骤记录下来,以便在后续的处理中使用。

    二、Session

    1.原理:

            客户端浏览器第一次访问,服务器端创建一个会话对象。并且具有id的唯一值。 依赖cookie将sessionId的值发送给客户端。第二次请求的时候,客户端浏览器携带sessionId到服务器。服务器端获得sessionId, 从而实现了会话跟踪。

    2.特点:

            创建在服务器端,并且保存在服务器端 。

    3.获得一个会话对象:

    1. import java.io.IOException;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import javax.servlet.http.HttpSession;
    8. @WebServlet("/testsession.do")
    9. public class testSessionServlet extends HttpServlet {
    10. @Override
    11. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    12. System.out.println("testSessionServlet被请求到了");
    13. HttpSession session = req.getSession();
    14. //当调用getSession(true)时,他首先检查用户的会话Cookie是否存在
    15. //如果不存在:为其创建新的session对象,将session对象的ID保存到新建的会话Cookie中,并 将会话cookie送回浏览器 。
    16. //如果存在:则按照会话Cookie 的值找到对应的session对象返回。
    17. System.out.println(session.getId());
    18. }
    19. }

    4.Session常见方法:

    1. // 获取Session
    2. HttpSession session = request.getSession();
    3. // 将指定Key-Value键值对,存入当前Session会话中。
    4. void setAttribute(String name, Object value);
    5. // 按照指定的Key从当前Session会话中获取Value,返回值为Object类型的对象,如果不存在,则返回null。
    6. Object getAttribute(String name);
    7. // 按照指定的Key从当前Session会话中删除Key-Value键值对。
    8. void removeAttribute(String name);
    9. // 获取当前Session会话的创建时间。
    10. long time = session.getCreationTime();
    11. // 获取当前Session会话最后一次请求的访问时间。
    12. long lastAccessedTime = session.getLastAccessedTime();
    13. // 获取当前Session会话的SESSION ID
    14. String id = session.getId();
    15. //设置最大有效时间,以秒为单位
    16. session.setMaxInactiveInterval(100);
    17. // session失效
    18. session.invalidate();

    三、Cookie和Session的区别:

    1. 保存的位置不同:cookie保存在浏览器端,session保存在服务端。
    2. 使用方式不同:cookie如果在浏览器端对cookie进行设置对应的时间,则cookie保存在本地硬盘中,此时如果没有过期,则就可以使用,如果过期则就删除。如果没有对cookie设置时间,则默认关闭浏览器,则cookie就会删除。                                                            session:我们在请求中,如果发送的请求中存在sessionId,则就会找到对应的session对象,如果不存在sessionId,则在服务器端就会创建一个session对象,并且将sessionId返回给浏览器,可以将其放到cookie中,进行传输,如果浏览器不支持cookie,则应该将其通过encodeURL(sessionID)进行调用,然后放到url中。
    3. 存储内容不同:cookie只能存储字符串,而session存储结构类似于hashtable的结构,可以存放任何类型。
    4. 存储大小:cookie最多可以存放4k大小的内容,session则没有限制。
    5. session的安全性要高于cooKie
    6. cookie的session的应用场景:cookie可以用来保存用户的登陆信息,如果删除cookie则下一次用户仍需要重新登录;session就类似于我们拿到钥匙去开锁,拿到的就是我们个人的信息,一般我们可以在session中存放个人的信息或者购物车的信息。
    7. session和cookie的弊端:cookie的大小受限制,cookie不安全,如果用户禁用cookie则无法使用cookie。如果过多的依赖session,当很多用户同时登陆的时候,此时服务器压力过大。sessionId存放在cookie中,此时如果对于一些浏览器不支持cookie,此时还需要改写代码,将sessionID放到url中,也是不安全。
  • 相关阅读:
    面试经典 150 题 14 —(数组 / 字符串)— 134. 加油站
    微信小程序 | 人脸识别的最终解决方案
    Redis 命令
    DIY CY7C68013A模块为逻辑分析仪
    Guava:Java开发者的全方位工具库
    图论 - 二分图(染色法、匈牙利算法)
    结构建模设计——Solidworks软件之特征成型中异形孔向导和线性阵列功能实战总结
    linux shell数组与字典用法总结
    如何完美通过token获取用户信息(springboot)
    Java NIO之Path、Files
  • 原文地址:https://blog.csdn.net/weixin_52386948/article/details/126529808