Cookie和HttpSession使用与区别

Session和Cookie的主要区别

**1. Cookie:

  1. 保存在浏览器的文件中
  2. 键和值都是字符串类型
  3. Session
    1. 保存在服务器的内存中
    2. 值可以是Object 类型**

如何查看Cookie的数据

​ 如何在不同的浏览器中查看Cookie的信息

Cookie的引入

  • 疑问:常见的网站登录,保存密码,下次自动登录如何实现?用户的数据应该保存到哪里?
  1. 用户名和密码保存在浏览器端的Cookie中
  2. 下次登录的时候读取Cookie中数据,发送给服务器
  3. 服务器会验证用户名和密码,如果正确,则完成自动登录。

如何查看Cookie信息

注:不同的浏览器Cookie保存的格式是不同的,而且相互之间不能共享

在Chrome中

​ Cookie本质上是一个键值对,键和值都是字符串类型。
Cookie和HttpSession使用与区别

Cookie的执行原理

  1. 什么是Cookie
  2. Cookie的执行原理

什么是Cookie

特点:本质上键值对,一个Cookie对象只能保存一对键和值,键和值都是字符串类型。

大小:所有的Cookie大小不能超过4K

Cookie运行的原理

Cookie和HttpSession使用与区别

访问流程

  	1. 浏览器第1次访问服务器,没有Cookie。由服务器创建Cookie对象
  	2. 以响应头Set-Cookie发送给浏览器
  	3. 浏览器接收到Cookie的信息,将Cookie保存到本地硬盘上。
  	4. 下次访问的时候,再读取本地Cookie信息发送给服务器,服务器就可以接收到Cookie的信息。

小结

Cookie的数据结构是什么样的?

键值对,键和值都是字符串类型

Cookie的创建和写入

  1. 如何创建Cookie
  2. 如何将创建的Cookie写入到浏览器端

创建和写入的方法

Cookie和HttpSession使用与区别

创建Cookie的案例演示

需求:

在Servlet中创建一个Cookie(“user”,“NewBoy”),并且写到浏览器端去。

运行效果

Cookie和HttpSession使用与区别

步骤

  1. 使用构造方法创建Cookie对象
  2. 使用响应对象的方法将创建好的Cookie写入到浏览器端
  3. 使用Chrome浏览器查看发送到浏览器的Cookie数据
  4. 也可以在响应头中查看有没有Set-Cookie响应头

代码

package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 Cookie的创建和写入
 */
@WebServlet(name = "Demo1CookieServlet", urlPatterns = "/demo1")
public class Demo1CookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建Cookie对象,提供键和值
        Cookie man = new Cookie("user", "NewBoy");
        //通过响应对象写入到浏览器端
        response.addCookie(man);

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("向浏览器写入了一个Cookie");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

查询响应头

Cookie和HttpSession使用与区别

设置Cookie过期的时间

如何设置Cookie的过期时间

设置Cookie过期时间的方法

Cookie和HttpSession使用与区别

案例:设置Cookie的过期时间

需求:

在写入Cookie之前先设置Cookie过期的时间,设置为10分钟以后过期

效果

Cookie和HttpSession使用与区别

步骤

  1. 创建Cookie
  2. 设置Cookie过期的时间,单位是秒
  3. 写入到浏览器端

代码

package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 Cookie的创建和写入
 */
@WebServlet(name = "Demo1CookieServlet", urlPatterns = "/demo1")
public class Demo1CookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建Cookie对象,提供键和值
        Cookie man = new Cookie("user", "NewBoy");
        //在写入之前设置过期的时间,单位是秒
        man.setMaxAge(60 * 10);  //10分钟
        //通过响应对象写入到浏览器端
        response.addCookie(man);

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("向浏览器写入了一个Cookie");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

查询响应头和浏览器的信息

Cookie和HttpSession使用与区别

读取Cookie的信息

目标

如何从浏览器读取Cookie的信息到服务器

读取Cookie的方法

Cookie和HttpSession使用与区别

演示案例

需求

  1. 修改写入的Servlet,创建两个Cookie
    Cookie和HttpSession使用与区别
  2. 创建Servlet读取所有Cookie信息,显示在浏览器上。

步骤

  1. 调用request.getCookies()返回一个Cookie对象数组
  2. 如果数组为null,打印没有读取到Cookie
  3. 如果不为空,则遍历每个Cookie对象:getName() getValue()

代码

package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "Demo3ReadServlet", urlPatterns = "/demo3")
public class Demo3ReadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        //1. 调用request.getCookies()返回一个Cookie对象数组
        Cookie[] cookies = request.getCookies();
        //2. 如果数组为null,打印没有读取到Cookie
        if (cookies==null) {
            out.print("没有读取到Cookie的信息");
        }
        //3. 如果不为空,则遍历每个Cookie对象:getName() getValue()
        else {
            for (Cookie cookie : cookies) {
                out.print("键:" + cookie.getName() + ",值:" + cookie.getValue() + "<hr/>");
            }
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

执行效果

Cookie和HttpSession使用与区别

浏览器查看请求头

Cookie和HttpSession使用与区别

小结

HttpServletRequest对象 作用
Cookie[ ] getCookies() 读取浏览器发送的所有Cookie数组
Cookie类的方法 作用
String getName() 得到键
String getValue() 得到值

Cookie中使用特殊字符

目标

Cookie中使用特殊字符的情况

特殊字符

注:在Tomcat8中cookie值中不能使用分号 ; 、逗号(,)、等号(=)以及空格,可以直接使用汉字。
Cookie和HttpSession使用与区别

使用特殊字符步骤

  1. 在创建cookie之前使用URL编码
  2. 将编码后的数据存入cookie
  3. 读取时,获取到cookie之后,解码数据,显示正常的数据

URL编码和解码的方法

Cookie和HttpSession使用与区别

案例:使用特殊字符

需求

  1. 向Cookie中写入一个字符串"Hello World"
  2. 再读取出来显示到浏览器上

步骤

  1. 创建写入的Servlet
    1. 写入前URL编码
    2. 创建Cookie
    3. 设置过期的时间
    4. 写入Cookie
  2. 创建读取的Servlet
    1. 得到浏览器端所有的Cookie信息
    2. 如果没有Cookie返回的空
    3. 如果有则遍历,读取其中的键和值
    4. 值需要使用URL解码后输出

代码

写入
package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;

/**
 写入特殊字符
 */
@WebServlet(name = "Demo4SpecialServlet", urlPatterns = "/demo4")
public class Demo4SpecialServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //对特殊字符使用URL编码
        Cookie cookie = new Cookie("say", URLEncoder.encode("Hello World","utf-8"));
        response.addCookie(cookie);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
读取
package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;

/**
 读取特殊字符
 */
@WebServlet(name = "Demo5ReadServlet", urlPatterns = "/demo5")
public class Demo5ReadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        //读取Cookie的数组
        Cookie[] cookies = request.getCookies();
        if (cookies!=null) {
            for (Cookie cookie : cookies) {
                //值要进行解码操作
                out.print(cookie.getName() + "=" + URLDecoder.decode(cookie.getValue(),"utf-8") + "<br/>");
            }
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

## 案例:得到用户上次访问的时间

目标

  1. 创建CookieUtils工具类读取Cookie中的数据
  2. 通过此案例学习Cookie的多次读取和写入
  3. Cookie中特殊字符的处理

需求

  1. 如果用户是第一次访问,则输出:您好,您是第1次访问!当前的时间是xxx
  2. 把这次访问服务器的时间写到Cookie中,注意空格的处理。
  3. 如果之前已经访问过,则从Cookie中得到上次访问的时间,显示:您好,欢迎您再次访问。上次访问的时间是:xxxx,当前的时间是xxxxx。

分析

Cookie和HttpSession使用与区别

步骤

  1. 创建一个CookieUtils,方法:从Cookie中取一个名字为name的值,如果有则返回值,没有则返回空。

    public static String getCookieValue(HttpServletRequest request , String name)
    
  2. 从Cookie中取一个叫visited的信息,如果为null,则表示第一次访问

  3. 否则读取Cookie的信息,并且显示上次访问的时间

  4. 无论上次访问时间是否为空,都把这次访问的时间写入Cookie中

代码

CookieUtils

package com.itheima.utils;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

/**
 创建一个CookieUtils工具类
 */
public class CookieUtils {

    /**
     从Cookie中取一个名字为name的值,如果有则返回值,没有则返回空。
     */
    public static String getCookieValue(HttpServletRequest request , String name) {
        //1. 得到所有的Cookie,返回数组
        Cookie[] cookies = request.getCookies();
        //2. 判断是否为空,如果不为空则遍历
        if (cookies!=null) {
            //3. 如果name与cookie的name相同
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals(name)) {
                    //则返回它的值
                    return cookie.getValue();
                }
            }
        }
        //4. 如果没有找到name或cookie的数组为空,返回null
        return null;
    }
}

Servlet

package com.itheima.servlet;

import com.itheima.utils.CookieUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 得到上次访问的时间 */
@WebServlet(name = "Demo6VisitedServlet", urlPatterns = "/demo6")
public class Demo6VisitedServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //使用工具类读取一个叫visited的键
        String value = CookieUtils.getCookieValue(request, "visited");
        String now = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date());
        //如果为空,则表示是第1次访问
        if (value == null) {
            out.print("<h2>欢迎您第1次访问,现在的时间是:" + now + "</h2>");
        } else {
            //不为空,value表示上一次的时间
            out.print("<h2>欢迎再次访问,上次的时间是:" + URLDecoder.decode(value, "utf-8") + "</h2>");
            out.print("<h3>现在的时间是:" + now + "</h3>");
        }
        //无论是否为空,这次的时间都要写到浏览器
        Cookie cookie = new Cookie("visited", URLEncoder.encode(now,"utf-8"));
        //设置过期的时间
        cookie.setMaxAge(60 * 60 * 24 * 30);  //1个月过期
        //写入到浏览器
        response.addCookie(cookie);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

效果

Cookie和HttpSession使用与区别

小结

1. 得到现在的时间
2. 从Cookie中取一个叫visited的信息,如果为null,则表示第一次访问
3. 否则读取Cookie的信息,并且显示上次访问的时间
4. 无论上次访问时间是否为空,都把这次访问的时间写入Cookie中
5. 设置过期的时间,保存一个月
6. 写入到浏览器
7. 注:要编码和解码

设置Cookie的访问路径

  1. 设置访问路径的作用是什么?
  2. 如何设置访问路径

设置路径的方法

Cookie和HttpSession使用与区别

设置路径的案例

需求

创建一个Cookie,设置过期时间,设置Cookie的访问路径

效果

Cookie和HttpSession使用与区别

步骤

  1. 创建一个Cookie
  2. 设置过期的时间
  3. 设置它的访问路径
  4. 写入到Cookie中

代码

package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 设置Cookie的访问路径
 */
@WebServlet("/demo7")
public class Demo7PathServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建Cookie对象,提供键和值
        Cookie man = new Cookie("user", "NewBoy");
        //在写入之前设置过期的时间,单位是秒
        man.setMaxAge(60 * 10);  //10分钟
        //设置访问路径
        man.setPath("/aaa");
        //通过响应对象写入到浏览器端
        response.addCookie(man);

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("向浏览器写入了1个Cookie");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
  • 如果没有设置访问地址,默认是当前项目的访问地址。如果没有项目的访问地址,使用/

如果访问路径是setPath(“/day-cookie”),以下路径浏览器会发送Cookie给服务器?

访问地址 能否访问到Cookie
http://localhost:8080/day-cookie/
http://localhost:8080/day-cookie/aa/bb
http://localhost:8080/day/ 不会
http://localhost:8080/ 不会

删除Cookie

目标

​ 学习删除Cookie的方法

方法

Cookie和HttpSession使用与区别

案例:删除指定的Cookie

需求

​ 删除指定的Cookie信息,注意Cookie的访问路径要相同

步骤

  1. 创建一个同名的Cookie
  2. 最好设置它的访问路径
  3. 设置它的过期时间为0
  4. 写入到浏览器,可以实现Cookie的删除

代码

package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 删除Cookie
 */
@WebServlet(name = "Demo8DeleteServlet", urlPatterns = "/demo8")
public class Demo8DeleteServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建一个Cookie,键要同名,值设置为空
        Cookie cookie = new Cookie("visited",null);
        //2. 设置过期时间为0
        cookie.setMaxAge(0);
        //3. 写入到浏览器端
        response.addCookie(cookie);

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("删除了Cookie");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

HttpSession对象的方法(重点)

  1. 如何得到会话对象
  2. 学习HttpSession接口中常用的方法

Session存储数据的特点

  1. 数据是保存在服务器端的内存中,以键和值的方式存在。
  2. 每个用户都会在服务器上有一个会话,一个会话保存一个用户的数据。
  3. 会话之间的数据不能共享
  4. 每个会话在服务器上都有过期的时间

HttpSession接口的方法

得到会话的方法

Cookie和HttpSession使用与区别
创建会话的时机:用户第1次访问的时候,创建会话。

会话接口中的方法

Cookie和HttpSession使用与区别

例:会话接口中方法的演示

步骤

  1. 得到会话对象
  2. 使用会话对象使用上面的各个方法

效果

Cookie和HttpSession使用与区别

代码

package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;

/**
 学习与会话有关的方法
 */
@WebServlet(name = "Demo1SessionServlet", urlPatterns = "/demo1")
public class Demo1SessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //得到会话
        HttpSession session = request.getSession();
        out.print("会话对象:" + session + "<hr/>");
        //得到会话的ID,格式是:32位的十六进制的数据,在同一个服务器是唯一的。
        out.print("会话的ID: " + session.getId() + "<hr/>");
        out.print("得到会话创建的时间:" + new Timestamp(session.getCreationTime()) + "<hr/>");
        out.print("得到上一次访问的时间:" + new Timestamp(session.getLastAccessedTime()) + "<hr/>");
        out.print("现在的时间:" + new Timestamp(System.currentTimeMillis()) + "<hr/>");
        out.print("判断是否是新的会话:" + session.isNew() + "<hr/>");
        out.print("得到上下文对象:" + session.getServletContext());
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

小结

HttpSession接口方法 作用
String getId() 得到会话的ID
long getCreationTime() 得到会话创建的时间
long getLastAccessedTime() 得到上次访问的时间
boolean isNew() 判断是否是新的会话
ServletContext getServletContext() 得到上下文域

会话域的操作方法(重点)

与会话域有关的操作方法

讲解

会话域中的方法

范围:一个用户访问的多次请求都可以使用
Cookie和HttpSession使用与区别

示案例

需求

​ 通过1个案例学习上面方法的使用

执行效果

  1. 先执行向会话域中添加值的Servlet

Cookie和HttpSession使用与区别
2.再执行从会话域中取值的Servlet
Cookie和HttpSession使用与区别
3.另一个浏览器执行的效果
Cookie和HttpSession使用与区别

实现步骤

  1. 创建SetServlet中,向Session域中添加一件字符串商品:洗衣机
  2. 创建另一个GetServlet中,从Session中取出商品并输出在网页上。
  3. 首先使用一个浏览器存和取
  4. 然后在另一个浏览器中取,看能不能取出来

代码

SetServlet.java
package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

/**
 向请求域中添加键和值
 */
@WebServlet(name = "Demo2SetServlet", urlPatterns = "/demo2")
public class Demo2SetServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("向会话域中添加了值");

        //得到会话域
        HttpSession session = request.getSession();
        //向会话域中添加值
        session.setAttribute("product","洗衣机");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
GetServlet.java
package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 从会话域中取出值
 */
@WebServlet(name = "Demo3GetServlet", urlPatterns = "/demo3")
public class Demo3GetServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print(request.getSession().getAttribute("product"));
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

结果分析

查看SetServlet中响应头

以Cookie的方式将会话ID发送给浏览器
Cookie和HttpSession使用与区别

会话访问的原理

目标

  1. 学习Session的会话原理
  2. 案例:保存会话ID到Cookie中

原理图

Cookie和HttpSession使用与区别

访问流程

  1. 不用浏览器是不同的会话,同一个浏览器的不同标签页是同一个会话。
  2. 浏览器第1次访问服务器,调用getSession()方法,由服务器创建一个会话,并且分配会话ID
  3. 通过Cookie的方式将会话ID发送给浏览器
  4. 浏览器下次访问的时候,通过Cookie把会话ID发送给服务器。
  5. 服务器通过会话ID来识别不同的用户

疑问

  1. 如果浏览器关闭,服务器上的会话信息是否还存在?

    还在存在的,一直到会话过期。服务器上会话也是有过期的时间的。

  2. 浏览器关闭以后,还能不能得到之前会话域中的信息?

    不能,因为浏览器关闭Cookie就失效,没有会话ID,也就得不到服务器上还存在的会话信息。

  3. 有没有可能让浏览器关闭还可以再访问服务器上没有过期的信息?

    可能,只要手动保存会话的ID到Cookie中,并且设置过期的时间就可以了。

演示案例

步骤

  1. 创建会话对象
  2. 得到会话的ID
  3. 创建一个Cookie,将它的名字设置为JSESSIONID,值为上面的会话ID
  4. 设置过期时间为30分钟
  5. 写入到浏览器

代码

package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;

/**
 向请求域中添加键和值
 */
@WebServlet(name = "Demo2SetServlet", urlPatterns = "/demo2")
public class Demo2SetServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("向会话域中添加了值");

        //得到会话域
        HttpSession session = request.getSession();
        //向会话域中添加值
        session.setAttribute("product","洗衣机");

        //创建Cookie
        Cookie cookie = new Cookie("JSESSIONID", session.getId());
        //设置过期时间30分钟
        cookie.setMaxAge(60 * 30);
        response.addCookie(cookie);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

效果

Cookie和HttpSession使用与区别

修改会话过期时间的三种方式

方式一:通过代码

Cookie和HttpSession使用与区别

示例:设置会话过期的时间为10秒,输出过期的时间,输出会话ID
代码
package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

/**
 修改会话过期的时间
 */
@WebServlet(name = "Demo4IntervalServlet", urlPatterns = "/demo4")
public class Demo4IntervalServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //得到会话
        HttpSession session = request.getSession();
        //设置过期的时间是10秒
        session.setMaxInactiveInterval(10);
        out.print("会话的ID: " + session.getId() + "<hr/>");
        out.print("会话过期的时间间隔:" + session.getMaxInactiveInterval() + "秒<br/>");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

方式二:可以通过web.xml的配置来实现

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!--配置会话过期的时间-->
    <session-config>
        <!--单位是分钟-->
        <session-timeout>5</session-timeout>
    </session-config>
</web-app>

疑问:如果同时使用代码和配置的方式以哪个为准?

以代码为准

方式三:立刻失效

Cookie和HttpSession使用与区别
修改会话过期的时间有哪三种方式?

  1. 通过代码:setMaxInactiveInterval(),单位是秒
  2. 通过配置文件:session-timeout 单位是分
  3. 立刻失效:session.invalidate()