020-服务端客户端会话技术【Session】最简单快速的理解方式

概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession

快速入门:

1. 获取HttpSession对象:
            HttpSession session = request.getSession();
2. 使用HttpSession对象:
            Object getAttribute(String name)  
            void setAttribute(String name, Object value)
            void removeAttribute(String name)  


    
原理
Session的实现是依赖于Cookie的。

白话理解:客户端发送请求到服务端后, 服务端会生成一个session对象,用来维持与这个客户端的会话,如果没有特殊操作的话是存储在服务端的内存里的,生成的这个session对象它会有一个id  叫做JSESSIONID  ,服务端会把JSESSIONID 当成cookie 发给客户端,当然这个过程也是自动完成的 JSESSIONID",session.getId() ,浏览器就会把这个key为JSESSIONID 值为sessionId的cookie缓存起来,那么下次浏览器发送其他请求时,就会把这个cookie带给服务器,服务器按照正常的获取session的方式获取即可。

因为ServletContext的作用域太大,不够安全,也不方便区分客户端,因此session可以用来多次请求间共享数据

细节

1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?

默认情况下。不是。
如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
                 Cookie c = new Cookie("JSESSIONID",session.getId());
                 c.setMaxAge(60*60);
                 response.addCookie(c);

2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作

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

项目正式部署在Tomcat后,整个钝化和活化过程是自动完成的
                
3. session什么时候被销毁?
1. 服务器关闭
2. session对象调用invalidate() 。
3. session默认失效时间 30分钟
    选择性配置修改    
                <session-config>
                    <session-timeout>30</session-timeout>
                </session-config>

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

session与Cookie的区别

  • session存储数据在服务器端,Cookie在客户端
  • session没有数据大小限制,Cookie有
  • session数据安全,Cookie相对于不安全

demo

用session存一个数据进行共享

@WebServlet("/sessionDemo1")
public class SessionDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用session共享数据
        //1.获取session
        HttpSession session = request.getSession();
        //2.存储数据
        session.setAttribute("msg","hello session");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

获取数据

@WebServlet("/sessionDemo2")
public class SessionDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用session获取数据
        //1.获取session
        HttpSession session = request.getSession();
        //2.获取数据
        Object msg = session.getAttribute("msg");
        System.out.println(msg);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

期望客户端关闭后,session也能相同

@WebServlet("/sessionDemo3")
public class SessionDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取session
        HttpSession session = request.getSession();
        System.out.println(session);
        //期望客户端关闭后,session也能相同
        Cookie c = new Cookie("JSESSIONID",session.getId());
        c.setMaxAge(60*60);//设置有效期
        response.addCookie(c);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
发布了103 篇原创文章 · 获赞 26 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/lindroid/article/details/104701465