Cookie和Session(八)

298 阅读5分钟

Cookie和Session【会话控制】

会话控制

流程控制:控制程序执行流程

会话控制:控制程序会话机制

会话:浏览器与服务器通信机制【状态】,浏览器不关闭且不更换即为当前会话

Cookie简介

概述

  • Cookie是由服务器创建,存储在浏览器端。
  • Cookie是存储少量信息的技术。
  • Cookie作用:服务器区分不同浏览器。

工作原理

  • 浏览器向服务器发送请求
  • 服务器创建Cookie对象,Cookie对象中存储用户信息,最终将Cookie发送浏览器。
  • 浏览器以后再次请求服务器时,携带Cookie对象。
  • 服务器通过Cookie对象中信息,区分不同浏览器。

Cookie的使用

Cookie创建

//        创建Cookie对象
        Cookie cookie = new Cookie("level","level-1");
//        将Cookie存储到浏览器
        response.addCookie(cookie);

Cookie的获取

//        获取Cookie【方式1】
        String cookie1 = request.getHeader("Cookie");
//        获取Cookie【方式2】--推荐使用
        Cookie[] cookies = request.getCookies();

Cookie修改

//        方式1【找到指定Cookie,修改value】
        for(Cookie cookie2:request.getCookies()){
            if("level".equals(cookie2.getName())){
                cookie2.setValue("level-2");
                response.addCookie(cookie2);
                break;
            }
        }
//        方式2【新建同名Cookie,覆盖原来的Cookie】--推荐使用
        Cookie cookie3 = new Cookie("level","level-2");
        response.addCookie(cookie3);

Cookie的API

cookie.getName() ; //返回cookie中设置的key
cookie.getValue(); //返回cookie中设置的value

Cookie键值对字符集问题

Cookie的name不支持中文字符集;

Cookie的value支持中文字符集,如果要使用中文字符集,需要设置底层编码字符集【UTF-8】,比较繁琐,这里更简易使用英文;

如果在Cookie中必须使用中文,需要做如下设置

//        设置编码
        Cookie cookie = new Cookie("level", URLEncoder.encode("会员1","UTF-8"));
        response.addCookie(cookie);
//        设置解码
        URLDecoder.decode(cookie.getValue(),"UTF-8");

Cookie的时效性

Cookie持久化

​ Cookie默认--【会话级别】:浏览器不关闭并且不更换那么Cookie始终有效【重启浏览器或者更换浏览器Cookie失效】。在浏览器端,Cookie数据存在于内存中。

​ 【持久化Cookie】:重启浏览器依然需要Cookie对象有效。在浏览器端,Cookie数据会被保存到硬盘上。Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响。持久化Cookie到达了预设的时间会被释放。

方法

cookie.setMaxAge(int expiry):ss是正整数,单位:秒。

  • ss > 0:设置Cookie持久化事件为ss秒【ss秒之后Cookie对象失效】
  • ss = 0:设置Cookie对象立即失效
  • ss < 0:设置Cookie对象默认为会话级别

注意事项

  • 一旦设置Cookie持久化,默认会话级别失效
  • 持久化Cookie对象后,依然无法跨越浏览器共享Cookie对象

Cookie有效路径

​ 上网时间长了以后,浏览器本地会保存很多Cookie。对于浏览器来说,访问互联网资源时不能每次都把所有Cookie带上。浏览器会使用Cookie的domain和path属性值和当前访问的地址进行比较,从而判断是否携带这个Cookie。

​ 我们可以通过调用cookie的setPath()方法和setDomain()方法来设置cookie的domain和path。

Cookie默认有效路径:当前上下文路径下有效

设置有效路径:setPath()

一般设置有效路径,均会设置在上下文路径下。

Cookie域名

域名的设置——setDomain()方法

Cookie应用

需求

1 使用Cookie实现10天免登录

2 使用Cookie实现10天免输入

示例代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
    <h2>登录页面</h2>
    <form action="UserServlet?method=login" method="post">
        用户名:<input type="text" name="username" value="${cookie.username.value}"><br>
        密码:<input type="password" name="pwd" value="${cookie.pws.value}"><br>
        10天免输入:<input type="checkbox" name="cb" value="cb"><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>
//1.获取请求参数
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
String cb = request.getParameter("cb");
System.out.println("cb = " + cb);
//2. 调用service【略】
if (cb != null) {
    //3. 将用户名&密码存储Cookie中
    Cookie unCookie = new Cookie("username",username);
    Cookie pwdCookie = new Cookie("pws",pwd);
    //持久化Cookie10天
    unCookie.setMaxAge(60*60*24*10);
    pwdCookie.setMaxAge(60*60*24*10);
    //将cookie响应浏览器
    response.addCookie(unCookie);
    response.addCookie(pwdCookie);
}

//4. 跳转路径
response.sendRedirect(request.getContextPath()+"/login_success.jsp");

Cookie缺陷

  1. Cookie的value是String类型,存储数据不灵活【Object】
  2. Cookie是存储浏览器端,相对不安全【服务器】
  3. Cookie数量过多,会浪费数据流量
  4. 各个浏览器厂商对Cookie均有限制【大小2-5kb,数量200-500个左右】

Session

Session简介

概述

  • Session是四大域对象之一
  • Session是会话控制对象之一

使用

1 Servlet获取Session对象的方式:request.getSession()

2 session的常用API:

  • setAttribute()
  • getAttribute()
  • removeAttribute()

Session工作原理【重要】

步骤1:浏览器向服务器发送请求【第一次:request.getSession()】

这里为什么是getSession?

只有请求中涉及到Session的话,服务器才会开始检测是否有Session,是否需要初始化一个Session。否则也没有必要使用Session,浪费空间。

步骤2:服务器创建Session对象,同时也会创建特殊Cookie对象【name:JSESSIONID,value:session的id】,最终将Cookie响应到浏览器端。

步骤3:浏览器优厚再次发送请求时,携带Cookie对象

步骤4:服务器通过Cookie对象,查询Session对象,从而通过Session对象区分不同浏览器。

Session程序中的工作原理【扩展版】

  1. 浏览器向服务器发送请求【不是第一次:request.getSession()】,原则上服务器不会创建Session对象,会获取已经创建Session对象使用

  2. 是否可以获取Session对象【由两个条件制约】

    • 条件1:判断特殊Cookie是否存在

      • 存在

        • 条件2:判断Session对象是否存在 【Session对象默认最大空闲时间为:30min】(在服务器的web.xml中设置的,如下)

          <session-config>
          	<session-timeout>30</session-timeout>
          </session-config>
          

          如果Session存在,获取Session直接使用就可以了;

          如果Session不存在:返回步骤2,执行一遍流程。

      • 不存在,返回步骤2,执行一遍流程。

Session的时效性

Session默认--【会话级别】:浏览器不关闭且不更换Cookie始终有效,重启浏览器或者更换浏览器Cookie失效。

Session持久化

  1. 首先持久化特殊Cookie——cookie.setMaxAge(ss);

  2. 在持久化Session【时间<=30min,那么这个步骤可以省略】

    非活动时间【空闲时间】:在使用Session这一刻开始计时,为空闲时间。

    • 全局设置:web.xml配置文件

      <!--设置session非活动时间[空闲时间]为30分钟-->
      <session-config>
              <session-timeout>30</session-timeout>
      </session-config>
      
    • 局部设置:

session.setMaxInactiveInterval(ss);整数【int】,单位:秒

  • ss>0:设置session空闲时间为ss秒
  • ss<=0:设置session永不失效【永久有效】

示例代码

//先持久化特殊Cookie
        for (Cookie cookie : request.getCookies()) {
            if("JSESSIONID".equals(cookie.getName())){
                //持久化特殊Cookie
//                cookie.setMaxAge(20);
                cookie.setMaxAge(200);
                response.addCookie(cookie);
                break;
            }

        }
        //再持久化Session【时间<=30分钟,该步骤可省略】
        HttpSession session = request.getSession();
        session.setMaxInactiveInterval(20);

注意事项

​ 持久化Session不可跨越浏览器。

Session失效的四种情况

  1. Session对象空闲时间达到了目标设置的最大值,自动释放

  2. Session对象被强制失效

    //强制Session失效
    session.invalidate();
    
  3. Web应用卸载

  4. 服务器进程停止

Session的钝化和活化

1.Session【会话域】与浏览器有关,与服务器“无关”【重启服务器,是不会影响Session对象的】。

2.Session是由服务器创建的。

什么是Session钝化

​ Session在一段时间内没有被使用或者关闭服务器时,会将当前存在的Session对象以及Session对象中的数据从内存序列化到磁盘的过程,我们称之为钝化

什么是Session活化

​ Session被钝化之后,服务器再次调用Session对象或者重启服务器时,将Session对象以及Session对象中的数据从磁盘反序列化到内存的过程,我们称之为活化

注意

session中的数据,同时需要序列化以及反序列化,如下

public class Student implements Serializable{}

如何开启服务器的钝化活化

如图所示

步骤1:打开服务器设置

开启钝化活化-1.png

步骤2:勾选session复选框【preserve session across restarts and redeploys --在重启和重新部署时保持会话】

开启钝化活化-2.png