• Session


    Session

    1.概念
    Session:服务端会话跟踪技术:将数据保存到服务端。

    • Session是存储在服务端而Cookie是存储在客户端
    • 存储在客户端的数据容易被窃取和截获,存在很多不安全的因素
    • 存储在服务端的数据相比于客户端来说就更安全
      2.Session的工作流程
      在这里插入图片描述
    • 在服务端的AServlet获取一个Session对象,把数据存入其中
    • 在服务端的BServlet获取到相同的Session对象,从中取出数据
    • 就可以实现一次会话中多次请求之间的数据共享了
    • 现在最大的问题是如何保证AServlet和BServlet使用的是同一个Session对象(在原理分析会讲解)?
      3.Session的基本使用
    • 在Javaee中提供了HttpSession接口,来实现一次会话的请求之间数据共享功能。
    • 具体的使用步骤为:
      • 获取Session对象,使用的是request对象
    HttpSession session = request.getSession();
    
    • 1
    • Session对象提供的功能:
      • 存储数据到session域中
    • void setAttribute(String name,Object o)
    • 根据key,获取值
    • Object getAttribute(String name)
    • 根据key,删除该键值对
    • void removeAttribute(String name)

    介绍完Session相关的API后,接下来通过一个案例来完成对Session的使用,具体实现步骤为:

    1)创建名为SessionDemo1的Servlet类

    @WebServlet("/demo1")
    public class SessionDemo1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2)创建名为SessionDemo2的Servlet类

    @WebServlet("/demo2")
    public class SessionDemo2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3)SessionDemo1:获取Session对象、存储数据

    @WebServlet("/demo1")
    public class SessionDemo1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        	//存储到Session中
            //1. 获取Session对象
            HttpSession session = request.getSession();
            //2. 存储数据
            session.setAttribute("username","zs");
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    (4)SessionDemo2:获取Session对象、获取数据

    @WebServlet("/demo2")
    public class SessionDemo2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取数据,从session中
            //1. 获取Session对象
            HttpSession session = request.getSession();
            //2. 获取数据
            Object username = session.getAttribute("username");
            System.out.println(username);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    (5)启动测试,

    • 先访问http://localhost:8080/cookie-demo/demo1,将数据存入Session
    • 在访问http://localhost:8080/cookie-demo/demo2,从Session中获取数据
    • 查看控制台

    在这里插入图片描述
    通过案例的效果,能看到Session是能够在一次会话中两次请求之间共享数据。

    小结

    至此Session的基本使用就已经完成了,重点要掌握的是:

    • Session的获取

      HttpSession session = request.getSession();
      
      • 1
    • Session常用方法的使用

      void setAttribute(String name, Object o)
      Object getAttribute(String name)
      
      • 1
      • 2

      **注意:**Session中可以存储的是一个Object类型的数据,也就是说Session中可以存储任意数据类型。

    介绍完Session的基本使用之后,那么Session的底层到底是如何实现一次会话两次请求之间的数据共享呢?

  • 相关阅读:
    Spring拦截器和过滤器的区别及详解
    无胁科技-TVD每日漏洞情报-2022-11-15
    【Pytorch】torch.nn.init.xavier_uniform_()
    canvas制作签名版
    华为机试真题 Java 实现【矩阵最大值】
    设计模式之中介者模式(行为型)
    Springboot旅游网站管理系统毕业设计、Springboot旅游线路和景点网站设计与实现 毕设作品参考
    行为型模式-责任链模式
    MYSQL常用命令
    记一次加锁导致ECS服务器CPU飙高的处理
  • 原文地址:https://blog.csdn.net/qq_53037676/article/details/126581492