Servlet常用对象(下)——Cookie、Session 和 ServletContext

Cookie 对象

​ cookie是一种客户端技术(浏览器技术),由服务器创建,响应给客户端的技术。数据存储在浏览器中。

  • cookie作用:

    • 数据不需要经过网络传输,可以提高网页效率,减轻服务器的负载
  • cookie不建议存放大量数据,存放大小在4k左右。一般用来储存不需要访问后台,只有浏览器需要的数据

Cookie的创建和发送

  • cookie的创建:

    • Cookie cookie = new Cookie(“键”, “值”);
  • cookie的发送:

    • response.addCookie(cookie对象);
    // 创建Cookie对象
    Cookie cookie = new Cookie("uname","admin");
    // 响应Cookie对象给浏览器
    response.addCookie(cookie);
    

Cookie的获取

  • 只能获取cookie的数组Cookie[],需要通过遍历,获取具体的cookie对象,然后再通过cookie的键得到对应的值

    // Cookie的获取
    Cookie[] cookies = request.getCookies();
    // 非空判断
    if (cookies != null && cookies.length > 0) {
        for (Cookie cookie : cookies) {
            // 获取cookie的名称
            String name = cookie.getName();
            // 获取cookie的值
            String value = cookie.getValue();
            // System.out.println(name +"=" + value);
    
            // 获取指定的cookie对象
            if("uname".equals(name)) {
                System.out.println("Cookie的值为:" + value);
            }
        }
    }
    

Cookie到期时间的设定

​ 到期时间用来指定该 cookie 何时失效。默认为当前浏览器关闭即失效。

  • 我们可以手动设定 cookie 的有效时间(通过到期时间计算),通过 setMaxAge(int time); 方法设定 cookie 的最大有效时间,以秒为单位。

  • 参数的三种情况:

    • 负整数:

      • cookie 的 maxAge 属性的默认值就是-1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么 cookie 就会消失
    • 正整数:

      • 表示 cookie 对象可存活指定的秒数
      • 当生命大于 0 时,浏览器会把 Cookie 保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie 也会存活相应的时间
    • 零:

      • cookie 生命等于 0 是一个特殊的值,它表示 cookie 被作废
      • 也就是说,如果原来浏览器已经保存了这个 Cookie,那么可以通过 Cookie 的 setMaxAge(0)来删除这个 Cookie
      • 无论是在浏览器内存中,还是在客户端硬盘上都会删除这个 Cookie。
      // 创建cookie对象
      Cookie cookie = new Cookie("name", "admin");
      
      // 设置cookie的到期时间
      // 正整数:表示存活指定秒数
      //cookie.setMaxAge(20); // 存活15秒
      // 设置3天失效
      //cookie.setMaxAge(3*24*60*60);
      
      // 负整数:在浏览器中存活
      // cookie.setMaxAge(-10);
      
      // 零:表示即刻删除
      cookie.setMaxAge(0);
      
      // 响应cookie给客户端
      response.addCookie(cookie);
      
      // 删除cookie对象
      Cookie cookie02 = new Cookie("uname2", null);
      // 删除cookie
      cookie02.setMaxAge(0);
      // 响应给客户端
      response.addCookie(cookie02);
      

Cookie注意事项

  • Cookie不跨电脑和浏览器
  • Cookie不支持中文
    • 如果有中文则通过 URLEncoder.encode()来进行编码,获取时通过 URLDecoder.decode()来进行解码
  • 不同的浏览器对Cookie也有限定,Cookie的存储有是上限的
    • Cookie是存储在客户端(浏览器)的,而且一般是由服务器端创建和设定

Cookie的覆盖

​ 在相同域名(domain)下和同路径(path)下,如果出现相同name的cookie对象,后面的cookie对象会将前面的覆盖。

Cookie的路径

  • 只有访问的路径中包含cookie的path的值,才能访问到该cookie对象
  • 设置当前服务器下所有项目都能访问到的cookie对象:cookie.setPath("/");

Session 对象

Session的概述

session是一次会话,在会话中可以包含多个请求。在会话中数据共享。

Session的获取

  • 语法:HttpSession session = request.getSession();

    • 如果session不存在,则创建一个新的session;如果session存在,则获取存在的session
    HttpSession session = request.getSession();
    

Session的方法

  • 获取会话标识符:session.getId();

  • 获取创建时间:session.getCreationTime();

  • 获取最后一次访问时间:session.getLastAccessedTime();

  • 是否是新的会话:session.isNew();

    // 获取会话标识符
    String id = session.getId();
    System.out.println("获取会话标识符:" + id);
    // 获取创建时间	
    long createTime = session.getCreationTime();
    System.out.println("获取创建时间:" + createTime);
    //	获取最后一次访问时间
    long lastAccessTime = session.getLastAccessedTime();
    System.out.println("获取最后一次访问时间:" + lastAccessTime);
    // 是否是新的会话
    boolean flag = session.isNew();
    System.out.println("是否是新的会话:" + flag);
    

会话标识 JSESSIONID

  • 当每一次请求到达服务器时,如果使用了session对象,都会判断客户端是否回传了一个JSESSIONID的cookie对象
    • 如果没有回传,则服务器会新建一次sessionId,并响应给客户端,浏览器会存一个相同值的JSESSIONID
    • 如果回传了,则会判断回传的值是否和后台的值一致
      • 如果一致,则表示是同一个会话,数据都可共享
      • 如果不一致,则服务器会新建一次sessionId,并响应给客户端,浏览器会存一个相同值的JSESSIONID
  • JSESSIONID 的 cookie,这是一个比较特殊的 cookie:
    • 当用户请求服务器时,如果访问了 session,则服务器会创建一个名为 JSESSIONID,值为获取到的 session(无论是获取到的还是新创建的)的 sessionId 的 cookie 对象,并添加到 response 对象中,响应给客户端,有效时间为关闭浏览器。
    • 所以 Session 的底层依赖 Cookie 来实现。

Session 域对象

​ Session 用来表示一次会话,在一次会话中数据是可以共享的,这时 session 作为域对象存在。

  • 方法:
    • setAttribute(name,value):方法向域对象中添加数据
    • getAttribute(name):从域对象中获取数据
    • removeAttribute(name):从域对象中移除数据

Session的销毁

  1. 默认到期时间(达到最大不活动时间)

    • 在指定时间段内没有任何请求,则失效;在时间到期之前有任何请求,则会重新计时

    • Tomcat服务器默认session的到期时间是30分钟

    • 可以修改默认的到期时间:在Tomcat安装目录下的conf目录中的web.xml中,单位是分钟

      <session-config>
          <session-timeout>30</session-timeout>
      </session-config>			
      
  2. 手动到期时间

    • 通过session.setMaxInactiveInterval(int);来设定 session 的最大不活动时间,单位为秒。
    • 通过 getMaxInactiveInterval();方法来查看当前 Session 对象的最大不活动时间。
  3. 销毁session对象

    • session.invalidate();
    // Session的获取
    HttpSession session = request.getSession();
    
    // 通过 getMaxInactiveInterval();方法来查看当前 Session 对象的最大不活动时间。
    int time = session.getMaxInactiveInterval();
    System.out.println("当前 Session 对象的最大不活动时间:" + time);
    
    // 通过session.setMaxInactiveInterval(int);来设定 session 的最大不活动时间,单位为秒。
    //session.setMaxInactiveInterval(10); //10秒钟失效
    
    // 销毁session对象
    session.invalidate();
    
  4. 关闭浏览器

    • session的底层依赖cookie,默认只在浏览器存活,关闭浏览器就失效。
  5. 关闭服务器

    • 只要在非正常关闭服务器时,才会销毁session
    • 如果是正常关闭服务器(选择服务器,右键选择stop),session不会失效。
    • 服务器会将session钝化(将数据从内存中存到磁盘中),下次访问session时会活化(从磁盘中读取到内存中)
      • 在Tomcat安装目录的work目录下,存放一个叫做SESSION.ser的文件

ServletContext 对象

​ 每一个web应用有且只有一个ServletContext对象,又称为application对象。

ServletContext 的作用

  • 作为域对象用来共享数据,此时数据在整个应用程序中共享
  • 该对象中保存了当前应用程序相关信息

ServletContext 的获取

  • 通过request对象获取:request.getServletContext();
  • 通过session对象获取:request.getSession().getServletContext();
  • 通过servletConfig获取:getServletConfig().getServletContext();
  • 直接获取:getServletContext();

常用方法

  • 获取服务器的版本信息 :getServerInfo();

  • 获取资源在服务器的真实路径:getRealPath();

    /**
     * 获取ServletContext对象
     */
    // 通过request对象获取
    ServletContext servletContext = request.getServletContext();
    // 通过session对象获取
    ServletContext servletContext2 = request.getSession().getServletContext();
    // 通过servletConfig获取
    ServletContext servletContext3 = getServletConfig().getServletContext();
    // 直接获取
    ServletContext servletContext4 = getServletContext();
    
    // 1)获取服务器的版本信息 getServerInfo()
    String serverInfo = request.getServletContext().getServerInfo();
    System.out.println("服务器版本信息:" +  serverInfo);
    // 2)获取资源在服务器的真实路径	getRealPath();
    String realPath = servletContext.getRealPath("/");
    System.out.println("获取资源在服务器的真实路径:" +  realPath);
    

ServletContext 域对象

​ 在整个应用程序中都有效;服务器关闭即失效。

  • 方法:
    • setAttribute(name,value):方法向域对象中添加数据
    • getAttribute(name):从域对象中获取数据
    • removeAttribute(name):从域对象中移除数据

Servlet三种域对象的区别

域对象特点
request 域对象一次请求中有效(请求转发有效)
session 域对象一次会话中有效(请求转发和重定向都有效)
servletContext 域对象整个应用中有效(服务器不关闭就都有效)
  • 如何选择:
    • 尽可能选择小范围的(范围越大,所需要资源越多)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值