Cookie和Session

什么是会话

浏览器/服务器之间也是有会话的,浏览器第1次发送请求给服务器,由服务器创建会话。每次浏览器请求,服务器就做出响应。浏览器的多次请求与服务器的多次响应就是会话,浏览器关闭或服务器上会话过期,则会话结束。

为什么有会话?

因为HTTP协议是一个无状态的协议,不记录用户上次访问的信息。需要有会话跟踪的技术来识别不同的用户。

会话的两种技术

客户端的会话技术:Cookie来实现
服务器端会话:Session来实现

浏览器查看Cookie

Chrome查看Cookie:
在这里插入图片描述
IE浏览器中如何查看Cookie:在指定的目录下,以文本文件的方法存在,扩展名叫:cookie

什么是Cookie

Cookie是servlet发送给Web浏览器的少量信息,由浏览器保存,然后发送回服务器。cookie的值可以唯一地标识客户机,因此cookie通常用于会话管理。

特点:Cookie其实就是一个键值对,键和值都是字符串类型。一个Cookie只能保存一个键值对。
大小:最长不超过4K

Cookie执行原理

在这里插入图片描述
访问流程:

  1. 浏览器第1次访问服务器,没有Cookie。由服务器创建Cookie,设置一个键值对。
  2. 由服务器通过响应头:Set-Cookie,将Cookie的数据发送给浏览器。
  3. 浏览器接收到服务器响应回来的Cookie信息,保存在本地。
  4. 下次浏览器再发送请求的时候,以请求头:Cookie发送数据给服务器。服务器得到浏览器发送回来数据。
  5. 从而实现了会话跟踪。

创建Cookie的方法

Cookie类是一个类
在这里插入图片描述
在这里插入图片描述

服务器通过Response将Cookie写入到浏览器

在这里插入图片描述

设置Cookie过期时间

在这里插入图片描述
在这里插入图片描述
参数是正,负,0分别表示:
正:单位是秒
负:浏览器关闭就过期
0:删除

Request读取Cookie

在这里插入图片描述

Cookie中使用特殊字符出现乱码

Cookie使用特殊字符会出现乱码,在将Cookie写到浏览器之前需要对特殊字符进行编码

URL编码和解码的方法、解决乱码

在这里插入图片描述
解决乱码问题:

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

创建会话的时机

用户第1次访问,并且调用getSession()方法就创建一个会话。服务器会分配一个会话ID给这个用户。

Session存储数据的特点

作用:提供一种方法,可以跨多个页面请求或访问Web站点来标识用户,并存储有关该用户的信息。

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

Session和Cookie的主要区别

  1. Cookie
    键和值是字符串类型
    数据保存在浏览器文件中
    一个Cookie只能保存一个键值对
  2. Session
    键是字符串,值是Object。
    数据保存在服务器的内存中
    一个会话域可以保存多个键和值,底层是Map结构

得到会话的方法

在这里插入图片描述

会话的方法

在这里插入图片描述

会话域中的方法

在这里插入图片描述

会话访问的原理

原理图:在这里插入图片描述
访问流程

  1. 浏览器第1次访问没有会话,由服务器调用getSession(),创建一个会话,分配一个会话ID
  2. 以Cookie,JSESSION=会话ID,的方式发送给浏览器。
  3. 浏览器得到会话ID,下次再以Cookie的方式发送给服务器。
  4. 服务器得到会话ID,在内存中去查找这个ID,找到以后将会话空间提供给用户使用。

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

服务器上的会话信息还是存在的,服务器上的会话也有过期的时间。默认是30分钟。

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

方式一:通过代码
在这里插入图片描述

时间间隔的含义:只要在这个时间间隔内有请求,服务器就会重新计时。
@WebServlet(name = "Demo4InvalidateServlet", urlPatterns = "/demo4")
public class Demo4InvalidateServlet 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();
        //设置过期时间间隔,单位是:秒
        session.setMaxInactiveInterval(10);
        out.print("会话ID:" + session.getId() + "<br/>");
        //得到最大的非活动时间间隔,单位是:秒
        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>

注:如果同时使用代码和配置的方式以代码为准

方式三:立刻失效
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值