Cookie

发布于:2024-04-10 ⋅ 阅读:(119) ⋅ 点赞:(0)

1.基本介绍

image-20240128165614796

image-20240128170007594

image-20240128170804712

cookie的简单示意图

image-20240128171827245

二说cookie

image-20240128172245749

image-20240128181752063

2.cookie常用方法

1.基本介绍

image-20240128182200012

image-20240128182209193

2.创建maven项目,导入servlet-api
3.创建cookie
package cookie;

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;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/createCookie")
public class CreateCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建cookie,可以创建多个
        Cookie cookie = new Cookie("sunxiansheng", "18");
        resp.addCookie(cookie);

        //设置编码
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.print("<h1>创建cookie成功</h1>");
        //关闭
        writer.flush();
        writer.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp); //合二为一
    }
}

image-20240128184507568

4.读取cookie

image-20240128185012473

package cookie;

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;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/readCookie")
public class ReadCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        if (cookies != null && cookies.length != 0) { //判断是否有内容
            for (Cookie cookie : cookies) { //遍历cookie
                System.out.println("name: " + cookie.getName() + " value: " + cookie.getValue());
            }
        }

        resp.setContentType("text/html;charset=utf-8;");
        PrintWriter writer = resp.getWriter();
        writer.print("<h1>cookie读取成功</h1>");
        writer.flush();
        writer.close();
    }

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

5.JSESSIONID
作用:用于区分不同的会话
6.读取指定cookie

image-20240128192543656

1.ReadCookie.java
package cookie;

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;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/readCookie")
public class ReadCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        String name = "sun";
        Cookie cookie = CookieUtils.readCookieByName(name, cookies);
        if (cookie != null) {
            System.out.println("name:" + cookie.getName() + " value:" + cookie.getValue());
        }

        resp.setContentType("text/html;charset=utf-8;");
        PrintWriter writer = resp.getWriter();
        writer.print("<h1>cookie读取成功</h1>");
        writer.flush();
        writer.close();
    }

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

2.CookieUtils.java
package cookie;

import jdk.nashorn.internal.ir.annotations.Ignore;

import javax.servlet.http.Cookie;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class CookieUtils {
    public static Cookie readCookieByName(String name, Cookie[] cookies) {
        //判断传进来的参数是否有问题
        if (cookies == null || cookies.length == 0 || name == null || "".equals(name)) {
            return null;
        }
        for (Cookie cookie : cookies) {
            String name1 = cookie.getName(); //获取cookie的名字
            if (name1.equals(name)) {
                return cookie;
            }
        }
        return null;
    }
}

7.修改指定cookie

image-20240128194342762

方式一:查找后修改
package cookie;

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;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/updateCookie")
public class UpdateCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取cookie
        Cookie[] cookies = req.getCookies();
        //要替换的cookie名字
        String name = "sun";

        resp.setContentType("text/html;charset=utf-8;");
        PrintWriter writer = resp.getWriter();

        //查找到cookie
        Cookie cookie = CookieUtils.readCookieByName(name, cookies);
        if (cookie != null) {
            cookie.setValue("succeed!");
            resp.addCookie(cookie); //将修改后的cookie添加到浏览器
            //响应信息
            writer.print("<h1>cookie修改成功</h1>");
        }
        else {
            writer.print("<h1>cookie修改失败</h1>");
        }
        //关闭
        writer.flush();
        writer.close();
    }

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

image-20240128200648314

方式二:添加同名cookie对象
package cookie;

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;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/updateCookie")
public class UpdateCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //要替换的cookie名字
        String name = "sun";
        //创建同名cookie对象,添加到浏览器
        Cookie cookie = new Cookie(name, "hello");
        resp.addCookie(cookie);

        resp.setContentType("text/html;charset=utf-8;");
        PrintWriter writer = resp.getWriter();

        writer.print("<h1>cookie修改成功</h1>");
        //关闭
        writer.flush();
        writer.close();
    }

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

image-20240128201355730

3.cookie生命周期

1.基本介绍

image-20240128201538524

2.指定秒数之后过期
package cookie;

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;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/cookieLive")
public class CookieLive extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建cookie
        Cookie cookie = new Cookie("lihua", "china");
        //设置生命周期,超过生命周期之后,浏览器向服务器发送请求的时候就不会携带cookie,但是只要浏览器不关闭cookie就可能还在浏览器内
        cookie.setMaxAge(60);
        //将cookie添加到浏览器
        resp.addCookie(cookie);

        resp.setContentType("text/html;charset=utf-8;");
        PrintWriter writer = resp.getWriter();
        writer.print("<h1>设置cookie生命周期</h1>");
        writer.flush();
        writer.close();
    }

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

image-20240128203100925

60秒内向服务器发送请求还会携带这个cookie

image-20240128203139706

过了60秒之后再向服务器发送请求就不会携带这个cookie了,但是还是有可能仍然存放在浏览器的Application中

image-20240128203210168

3.设置立即过期(相当于删除cookie)
package cookie;


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;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/cookieLive")
public class CookieLive extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取所有cookie
        Cookie[] cookies = req.getCookies();
        //查找到需要删除的cookie
        Cookie cookie = CookieUtils.readCookieByName("sun", cookies);
        //设置为立即过期,即删除
        cookie.setMaxAge(0);
        //将修改后的cookie发送到浏览器
        resp.addCookie(cookie);


        resp.setContentType("text/html;charset=utf-8;");
        PrintWriter writer = resp.getWriter();
        writer.print("<h1>cookie删除成功</h1>");
        writer.flush();
        writer.close();
    }

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

image-20240128204758883

image-20240128204830545

4.不设置生命周期

不设置生命周期,则默认是cookie.setMaxAge(-1),就是会话级别,当浏览器关闭自动销毁

5.持久化存储

当生命周期设置的很长时,比如一年,即使浏览器关闭,cookie也是存储在浏览器的,每次浏览器向服务器发送请求时都会携带这个cookie

4.cookie有效路径

1.基本规则

image-20240129091952550

image-20240129092006334

2.应用实例
package cookie;

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 javax.xml.ws.spi.http.HttpContext;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/cookiePath")
public class CookiePath extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //演示有效路径的使用
        Cookie cookie = new Cookie("sun", "path"); //不设置有效路径就默认是上下文路径/cookie_session
        Cookie cookie1 = new Cookie("sun1", "path1");
        cookie1.setPath("/cookie_session/path1"); //是给浏览器解析的,这里设置上下文路径加path1
        Cookie cookie2 = new Cookie("sun2", "path1path2");
        cookie2.setPath("/cookie_session/path1/path2"); //是给浏览器解析的,设置上下文路径加path1/path2

        //添加到浏览器
        resp.addCookie(cookie);
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);

        //显示信息
        resp.setContentType("text/html;charset=utf-8;");
        PrintWriter writer = resp.getWriter();
        writer.print("<h1>cookie有效路径设置成功</h1>");
        writer.flush();
        writer.close();


    }

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

image-20240129094213594

image-20240129094224460

image-20240129094258620

image-20240129094305667

5.cookie课后练习

image-20240129094616514

1.cookieLogin.java
package cookie;

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;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/cookieLogin")
public class cookieLogin extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8;");
        PrintWriter writer = resp.getWriter();

        String res = ""; //初始的value为空字符串
        //读取cookie,如果cookie中有username,则将这个username的值填充到界面,
        //如果没有的话直接返回value为空的表单
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("username")){
                res = cookie.getValue(); //将value设置成用户名再返回
            }
        }

        //返回表单
        writer.print("<!DOCTYPE html>\n" +
                "<html lang=\"en\">\n" +
                "<head>\n" +
                "    <meta charset=\"UTF-8\">\n" +
                "    <title>Title</title>\n" +
                "</head>\n" +
                "<body>\n" +
                "<h1>用户登录界面</h1>\n" +
                "<form action=\"checkUser\" method=\"get\">\n" +
                "    用户名:<input type=\"text\" value=\"" + res +
                "\" name=\"username\"><br>\n" +
                "    密码:<input type=\"password\" name=\"password\"><br>\n" +
                "    <input type=\"submit\" value=\"登录\">\n" +
                "</form>\n" +
                "</body>\n" +
                "</html>");
    }
}

2.checkUser.java
package cookie;

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;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/checkUser")
public class checkUser extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8;");
        PrintWriter writer = resp.getWriter();

        String username = req.getParameter("username");
        //进行简单的校验
        if (username.equals("sun")) { //如果登录成功,则设置cookie
            Cookie cookie = new Cookie("username", username);
            cookie.setMaxAge(1000000); //设置生命周期
            resp.addCookie(cookie);
            writer.print("<h1>登录成功</h1>");
        }
    }

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

3.结果展示

image-20240129103633910

image-20240129103653262

image-20240129103716631

image-20240129103754043

6.cookie注意事项和细节

image-20240129104208455

7.cookie中文乱码解决

image-20240129104354384

1.cookieEncode.java(url编码)
package cookie;

import com.sun.org.apache.xpath.internal.operations.Variable;

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

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/cookieEncode")
public class cookieEncode extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建有中文的cookie

        //将中文内容进行url编码,在读取的时候使用url解码
        String value = URLEncoder.encode("孙显圣","utf-8");

        Cookie cookie = new Cookie("name", value);
        resp.addCookie(cookie);


        resp.setContentType("text/html;charset=utf-8;");
        PrintWriter writer = resp.getWriter();

        writer.print("<h1>中文cookie设置成功</h1>");
        //关闭
        writer.flush();
        writer.close();
    }

}

2.cookieDecode.java(url解码)
package cookie;

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;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/cookieDecode")
public class cookieDecode extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取cookie
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("name")) {
                //url解码
                String decode = URLDecoder.decode(cookie.getValue(),"utf-8");
                System.out.println(decode);
            }
        }
    }

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

image-20240129110115457

image-20240129110108720

image-20240129110123834

8.cookie小结(重点)

1.创建cookie
        //创建cookie,可以创建多个
        Cookie cookie = new Cookie("sunxiansheng", "18");
        resp.addCookie(cookie);
注意:

cookie只要设置了就立即生效!!!

2.获取cookie数组
Cookie[] cookies = req.getCookies();
3.读取指定cookie
        Cookie[] cookies = req.getCookies();
        String name = "sun";
        Cookie cookie = CookieUtils.readCookieByName(name, cookies);
        if (cookie != null) {
            System.out.println("name:" + cookie.getName() + " value:" + cookie.getValue());
        }
4.修改指定cookie
方式一:查找后修改
        //获取cookie
        Cookie[] cookies = req.getCookies();
        //要替换的cookie名字
        String name = "sun";
        //查找到cookie
        Cookie cookie = CookieUtils.readCookieByName(name, cookies); //CookieUtils是自己写的工具类,用于查找到指定名字的cookie
        if (cookie != null) {
            cookie.setValue("succeed!");
            resp.addCookie(cookie); //将修改后的cookie添加到浏览器
            //响应信息
        }
方式二:添加同名cookie对象覆盖原有value
        //要替换的cookie名字
        String name = "sun";
        //创建同名cookie对象,添加到浏览器
        Cookie cookie = new Cookie(name, "hello");
        resp.addCookie(cookie);
5.JSESSIONID
区分不同会话,每次打开浏览器向服务器发送请求则开启一次会话,关闭浏览器则会话结束
6.cookie生命周期

image-20240128201538524

7.cookie有效路径
只有包含有效路径的url请求才会携带这个cookie
        //演示有效路径的使用
        Cookie cookie = new Cookie("sun", "path"); //不设置有效路径就默认是上下文路径/cookie_session
        Cookie cookie1 = new Cookie("sun1", "path1");
        cookie1.setPath("/cookie_session/path1"); //是给浏览器解析的,这里设置上下文路径加path1
        Cookie cookie2 = new Cookie("sun2", "path1path2");
        cookie2.setPath("/cookie_session/path1/path2"); //是给浏览器解析的,设置上下文路径加path1/path2

        //添加到浏览器
        resp.addCookie(cookie);
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);

网站公告

今日签到

点亮在社区的每一天
去签到