Servlet简介-会话技术(三)

78 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情 >>

会话技术

  • 会话:一次会话中包含多次请求和响应;一次会话是指浏览器第一次向服务器发起请求,会话建立,直到有一方断开为止;

  • 功能:再一次会话的范围内的多次请求间共享数据;

  • 方式:

    • Cookie:客户端(浏览器)会话技术;
    • Session:服务器端会话技术;

Cookie

概念:客户端会话技术,将数据保存在客户端。

实现原理:基于响应头set-cookie(发送) 和 请求头cookie实现(接收);

使用步骤:

  1. 创建cookie对象,绑定数据
Cookie cookie = new Cookie(String name, String value);
  1. 发送Cookie对象,在响应头中的set-cookie字段中;
response.addCookie(cookie);
  1. 获取Cookie,拿到Cookie,在下一次请求请求头的cookie字段中;
Cookie[] cookies = request.getCookies();//数组

细节:

  1. 一次可不可以发送多个cookie?

    • 可以,创建多个cookie对象,多次调用addCookie方法;
  2. cookie在浏览器中保存多长时间?

    • 默认情况下,当浏览器关闭后,cookie数据被销毁;

    • 持久化存储,设置有效期:cookie.setMaxAge(int seconds);

      参数为正数表示持久化到硬盘并设置cookie存活时间,单位秒;负数为默认值;0代表删除cookie信息;

  3. cookie能不能存中文?

    • tomcat8 之前不能直接存储中文数据,tomcat8之后支持中文数据;
    • tomcat8之前对中文要进行URL编码存储,URL解码解析;
    • tomcat8对特殊字符如空格等也不支持,要进行URL编码存储;
  4. cookie共享问题?

    • 在同一个tomcat服务器下的多个web项目不可以共享cookie;

    • 可以通过设置有效路径:cookie.setPath(String uri);设置cookie的获取范围。默认情况下为当前项目的虚拟目录;

    • 如果要在同一服务器内多个web项目共享,可以把path设置为"/",表示服务器内部共享;

    • 如果要在不同服务器间进行cookie共享,可以设置域名setDomain(String path):如果设置一级域名相同,那么多个服务器之间的cookie可以共享;

      • setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com之间的cookie可以共享;

特点:

  1. cookie存储在客户端浏览器;
  2. 浏览器对于单个cookie的大小有限制,以及对同一个域名下的总数量也有限制;

作用:

  • cookie一般用于存储少量的不太敏感的数据;
  • 在不登录的情况下,完成服务器对客户端的身份识别;

Session

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

实现原理:session的实现是依赖于cookie的;

Session也是一个域对象,与Request、ServletContext相似,也有域对象同样的方法:

  • Object getAttribute(String name);
  • void setAttribute(String name, Object value);
  • void removeAttribute(String name);

使用步骤:

  1. 创建/获取session对象;

    • 如果请求中拥有session的标识符也就是JSSESIONID,则返回其对应的session对象
    • 如果请求中没有JSSESIONID,则创建新的session对象,并将其JSSESIONID作为cookie对象存储到浏览器的运行内存中
    • 如果session对象失效了,也会创建一个session对象,并将其JSESSION对象存储到浏览器的运行内存中
HttpSession session = request.getSession();
  1. 存储数据
session.setAttribute(String name, Object value);
  1. 获取数据
Object value = session.getAtrribute(String name);

注意:存储数据的动作和获取数据的动作发生在不同的请求中,但是存储要先于取出执行;

细节:

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

    默认情况下,不是。默认情况下,浏览器关闭后,cookie即失效,session也就失效了,除非提前创建cookie并设置最大存活时间,让cookie持久化保存,在设置时间范围内,获取的session为同一个。

    Cookie c = new Cookie("JSESSIONID", session.getId());
    c.setMaxAge(60*60);
    response.addCookie(c);//此时1小时内,获取的session为同一个;
    
  2. 客户端不关闭,服务器关闭后,两次获取的session是否为同一个?

    不是。但是要确保数据不丢失。Tomcat服务器自动实现钝化和活化;

    • session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上;
    • session的活化:在服务器启动后,将session文件转化为内存中的session对象;
  3. session什么时候被销毁?

    • 服务器关闭;

    • session对象调用invalidate() session.invalidate();

    • 默认失效时间为30分钟;

      可以在web.xml中配置session-config设置默认失效时间。

      也可以设置:hs.setMaxInactiveInterval(int seconds);

特点:

  • session用于存储一次会话的多次请求的数据,存在服务器端
  • session可以存储任意类型,任意大小的数据
  • 依赖cookie技术,生命周期为一次回话,默认存储时间是30分钟
  • session对象的唯一标识JSESSIONID同过cookie技术作为一个cookie数据存储到浏览器的运行内存中

与cookie的区别:

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

总结:

  1. 总结:session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下,用户的任意请求在处理时都能获取到同一个session对象
  2. 注意:JSESSIONID存储在了cookie的临时存储空间中,浏览器关闭即失效;