一篇文章搞懂Cookie

目录

1 什么是Cookie

2 创建Cookie

3 浏览器查看Cookie

3.1 浏览器查看Cookie的第一种方式

3.2 浏览器查看Cookie的第二种方式

4 获取Cookie

5 修改Cookie

6 Cookie编码与解码

6.1 创建带中文Cookie

6.2 读取带中文Cookie

6.3 获取中文Cookie请求效果

6.4 解决创建和获取中文Cookie

7 Cookie优点和缺点

7.1 Cookie优点

7.2 Cookie缺点


1 什么是Cookie

Cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的一小段数据。

一旦Web浏览器保存了某个Cookie,那么它在以后每次访问该Web服务器时,都应在HTTP请求头中将这个Cookie回传给Web服务器。

一个Cookie主要有标识该信息的名称(name)和值(value)组成。

2 创建Cookie

//设置Cookie
 Cookie cookie = new Cookie("username", "zhangsan");

/*
*设置Cookie存活时间,在浏览器内存中的保存时间,单位为秒,
*   正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
*   负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
*   零:删除对应Cookie
*/
cookie.setMaxAge(60);

//设置Cookie的访问路径
cookie.setPath("/webProject05_war_exploded/GetCookieValueServlet01");

//发送Cookie到客户端
response.addCookie(cookie);

3 浏览器查看Cookie

3.1 浏览器查看Cookie的第一种方式

3.2 浏览器查看Cookie的第二种方式

 

4 获取Cookie

//获取所有Cookie
Cookie[] cookies = request.getCookies();

//遍历数组,获取所有的Cookie
for (Cookie cookie : cookies) {
    System.out.println(cookie.getName() + "-" + cookie.getValue());
}

System.out.println("----------------------------------------");

//遍历数组,获取指定的Cookie
for (Cookie cookie : cookies) {
   if (cookie.getName().equals("username")) {
      System.out.println(cookie.getName() + "-" + cookie.getValue());
   }
}

5 修改Cookie

只需要保证Cookie的名称和路径一致即可修改

注意:如果改变cookie的name和有效路径,会新建cookie,而改变cookie值、有效期会覆盖原有cookie

 //设置Cookie,如果改变cookie的name和有效路径,会新建cookie,而改变cookie值、有效期会覆盖原有cookie
Cookie cookie = new Cookie("username", "lisi");

/*
*设置Cookie存活时间,在浏览器内存中的保存时间,单位为秒,
*   正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
*   负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
*   零:删除对应Cookie
*/
cookie.setMaxAge(30);

//设置Cookie的访问路径
 cookie.setPath("/webProject09_war_exploded/GetCookieValueServlet01");

//发送Cookie到客户端
response.addCookie(cookie);

6 Cookie编码与解码

Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码

  • 编码可以使用java.net.URLEncoder类的encode(String str,String encoding)方法

  • 解码可以使用java.net.URLDecoder类的decode(String str,String encoding)方法

6.1 创建带中文Cookie

package com.cxyzxc.www.servlet01;

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;

@WebServlet(name = "CookieServlet03", value = "/CookieServlet03")
public class CookieServlet03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码
        Cookie cookie = new Cookie("姓名", "张三");

        //设置Cookie的访问路径
        cookie.setPath("/webProject09_war_exploded/GetCookieValueServlet03");

        //发送Cookie到客户端
        response.addCookie(cookie);
    }

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

6.2 读取带中文Cookie

package com.cxyzxc.www.servlet01;

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;

@WebServlet(name = "GetCookieValueServlet03", value = "/GetCookieValueServlet03")
public class GetCookieValueServlet03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取所有Cookie
        Cookie[] cookies = request.getCookies();

        //遍历数组,获取所有的Cookie
        for (Cookie cookie : cookies) {
            System.out.println(cookie.getName() + "-" + cookie.getValue());
        }

        System.out.println("----------------------------------------");

        //遍历数组,获取指定的Cookie
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("姓名")) {
                System.out.println(cookie.getName() + "-" + cookie.getValue());
            }
        }

    }

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

6.3 获取中文Cookie请求效果

 

6.4 解决创建和获取中文Cookie

6.4.1 创建中文Cookie

package com.cxyzxc.www.servlet01;

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 = "CookieServlet04", value = "/CookieServlet04")
public class CookieServlet04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码
        Cookie cookie = new Cookie(URLEncoder.encode("姓名","UTF-8"),URLEncoder.encode("张三","UTF-8"));

        //设置Cookie的访问路径
        cookie.setPath("/webProject09_war_exploded/GetCookieValueServlet04");

        //发送Cookie到客户端
        response.addCookie(cookie);
    }

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

6.4.2 获取中文Cookie

package com.cxyzxc.www.servlet01;

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.URLDecoder;

@WebServlet(name = "GetCookieValueServlet04", value = "/GetCookieValueServlet04")
public class GetCookieValueServlet04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取所有Cookie
        Cookie[] cookies = request.getCookies();

        //遍历数组,获取指定的Cookie
        for (Cookie cookie : cookies) {
            if (URLDecoder.decode(cookie.getName(),"UTF-8").equals("姓名")) {
                System.out.println(URLDecoder.decode(cookie.getName(),"UTF-8") + "-" + URLDecoder.decode(cookie.getValue(),"UTF-8"));
            }
        }

    }

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

6.4.3 获取中文Cookie请求效果

 

7 Cookie优点和缺点

7.1 Cookie优点

  • 可配置到期规则

  • 简单性:Cookie是一种基于文本的轻量结构,包含简单的键值对

  • 数据持久性:Cookie默认在过期之前是可以一直存在客户端浏览器上的

7.2 Cookie缺点

  • 大小受到限制:大多数浏览器对Cookie的大小有4K、8K字节的限制

  • 用户配置为禁用:有些用户禁用了浏览器或客户端设备接收Cookie的能力,因此限制了这一功能

  • 潜在的安全风险:Cookie可能会被篡改。会对安全性造成潜在风险或者导致依赖于Cookie的应用程序失败

猜你喜欢

转载自blog.csdn.net/swy2560666141/article/details/128983296