• Session会话追踪的实现机制



    Ssession中文经常翻译为“会话”,Session跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

    一、认识Sessio

    Session技术是服务端的解决方案,它是通过服务器来保持状态的。
    我们可以把客户端浏览器与服务器之间一系列交互的动作称为一个 Session,也就是会话。具体一点,就是程序需要为每个客户端的请求创建一个session,客户端访问时,服务器首先检查这个客户端的请求里是否已包含了一个已经标识过的session id,如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个session),当然,如果用户在一段时间内没有访问服务器,那么Session会自动失效。我们就把这种基于唯一ID识别用户(客户端)身份的机制称为Session(会话)。


    二、会话追踪

    Session对应的类为javax.servlet.http.HttpSession类;Session也是一种key-value的属性对,通过getAttribute(Stringkey)setAttribute(String key,Objectvalue)方法读写客户状态信息。一般来说,session对象使用Cookie进行会话追踪。

    首先,需要通过request请求的getSession()方法获取Session会话。也可以通过getId()来获取sessionid
    Servlet中必须使用request来编程手动获取HttpSession对象,而JSP中内置了Session隐藏对象,可以直接使用。

    @WebServlet("/one.do")  //设置访问路径
    public class OneServlet extends HttpServlet {
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
    		HttpSession session = request.getSession(); //获取session会话的对象
    		System.out.println(session.getId()); //获取sessionid
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    服务器通过一个名为JSESSIONID 的Cookie 来识别session,如果是第一次访问,服务器会创建session,根据这个新的Session_ID,创建一个名为"JSESSIONID"的Cookie,将Session_ID存入Cookie。
    这个过程,在我们获取session对象时,也可以通过访问客户端的浏览器的开发者工具里可以观察其过程。在请求Session前,我们在请求头里是找不到cookie对应的sessionId的,当然肯定也找不到"JSESSIONID"
    在这里插入图片描述

    但在请求session对像后,我们就可以在cookie里找到我们存入的"JSESSIONID";
    在这里插入图片描述
    观察也可以发现,和我们控制台上获取打印输出的sessionid的值是一样的。
    在这里插入图片描述

    在之后的访问里,我们在请求头里也会看到存入的cookie:
    下面使用不同的ip地址访问举例:
    在这里插入图片描述
    当然,也和控制台打印出来的一致

    用一个图来辅助理解
    在这里插入图片描述

    Session的使用比Cookie方便,但是过多的Session存储在服务器内存中,会对服务器造成压力。

    Session的生命周期

    Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。而每个客户端都会有一个独立的Session。如果当大量客户访问服务器时可能会导致内存溢出。因此,session在一定时间或条件下,也会被销毁。Session生成后,只要用户继续访问,服务器就会更新Session的最后那一次的访问时间,并维护该Session。所以在用户第一次访问session后,用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session更新”活跃“了一次。
    **注意:Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session**,只访问HTML等静态页面时并不会创建Session

    Session的有效期

    当有大量用户访问服务器时,Session也会越来越多。为了防止内存溢出,服务器会把长时间内没有活跃过也就是没有访问过服务器的Session从内存删除。如果超过了 session的超时时间 没访问过服务器,Session就自动失效了。例如,Tomcat中Session的默认超时时间为30分钟,30分种内没有访问服务器,session就会自动失效。
    当然啦!我们也可以人为的控制session的超时时间或是否销毁:

    • 可以修改session的超时时间;通过setMaxInactiveInterval(longinterval)修改。
    • Session的超时时间也可以在web.xml中修改
    • 通过调用Session的invalidate()方法可以使Session失效

    Session的常见方法

    1. setAttribute(String attribute, Object value);将指定Key-Value键值对,存入当前Session会话中。value参数可以为任何Java Object。
    2. getAttribute(String attribute);按照指定的Key从当前Session会话中获取Value,返回值为Object类型的对象,如果不存在,则返回null。
    3. removeAttribute(String name);按照指定的Key从当前Session会话中删除Key-Value键值对。
    4. getLastAccessedTime():获取当前Session会话最后一次请求的访问时间。
    5. getId();获取当前Session会话的SESSION ID,返回值为String。
    6. setMaxInactiveInterval(int second);设置Session的超时时间。单位为秒。
    7. getMaxInactiveInterval();返回Session的超时时间。单位为秒。超过该时间没有访问,服务器认为该Session失效
    8. invalidate();使该Session失效

    三、Cookie与Session的区别

    • cookie不是很安全,Cookie存储在客户端阅读器中,对客户端是可见的。Session相对安全。
    • Cookie保管在客户端,不占用服务器资源,假如并发用户十分多,Cookie是很好的选择;session保存在服务器的内存上。所以session不适合高并发和大浏览量的项目选择;
    • 使用cookie需要得到客户端浏览器的允许。如果客户端浏览器不支持cookie,那cookie无法实现追踪。

    在这里插入图片描述

  • 相关阅读:
    Games101笔记-计算机图形学概述
    Photoshop极坐标滤镜打造炫彩烟花
    量化交易全流程(五)
    FreeIPA 统一身份认证实现
    SAKO搜索帮助增强(FB02科目搜索帮助)
    如何10分钟搭建效果领先的语义搜索系统?
    云RADIUS认证服务:基础设施上云后的趋势
    web网页设计期末课程大作业 HTML+CSS+JavaScript 美食餐饮文化主题网站设计 学生DW静态网页设计
    【数字通信原理】第五章 基带传输理论
    Flink开发语言使用Java还是Scala合适?
  • 原文地址:https://blog.csdn.net/weixin_53233753/article/details/126573987