JavaWeb----知识点6

今天来介绍一下Cookie。

什么是Cookie呢:

1. cookie是服务器通知客户端保存键值对的一种技术
2. 客户端有了cookie以后,每次请求都发送给服务器
3. 每个cookie的大小不超过4kb

cookie简单来说就是当用户浏览网页时,网页为了辨别用户身份会把用户的一些信息封装到一个对象中并保存在用户的本地。

比如说一个用户登录网上商城,登录成功后这个网站接下来的页面应该确认用户的身份,比如获取用户账号信息等,这里确认用户身份所需要的信息就来自于Cookie。

Cookie的形式是键值对,格式如下:

key = value

Cookie又是如何被服务器保存的呢:

通过请求头,Cookie:发送请求给服务器
服务器通过req.getCookies() 返回Cookie数组

我们对Cookie可以有如下操作:

1、创建Cookie
2、获取Cookie
3、修改Cookie的存活周期
4、删除Cookie
5、设置Cookie的路径

操作示范:

1、创建Cookie

jsp页面代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <base href="http://localhost:8080/demo/">
</head>
<body>

<iframe name="target" style="width: 500px;height: 500px;float: left" ></iframe>
<div>
    <ul style="list-style: none">
        <li><a target="target" href="cookieServlet?action=createCookie">Cookie的创建</a></li>
        <li><a target="target" href="cookieServlet?action=getCookie">Cookie的获取</a></li>
        <li><a target="target" href="cookieServlet?action=updateCookie">Cookie值的修改</a></li>
        <li><a target="target" href="cookieServlet?action=lifeControl">Cookie的存活周期</a></li>
        <li>
            <ul style="list-style: none">
                <li><a>Cookie的默认存活时间</a></li>
                <li><a>Cookie的立即删除</a></li>
                <li><a>Cookie存活3600秒</a></li>
            </ul>
        </li>
        <li><a target="target" href="cookieServlet?action=testPath">Cookie的路径设置</a></li>
        <li><a href="">Cookie的用户免登录练习</a></li>
    </ul>
</div>
</body>
</html>

web.xml配置:

<servlet>
        <servlet-name>CookieServlet</servlet-name>
        <servlet-class>cookie.CookieServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CookieServlet</servlet-name>
        <url-pattern>/cookieServlet</url-pattern>
    </servlet-mapping>

在servlet程序中,我们首先编写BaseServlet程序便于我们去操作:

BaseServlet:

public class BaseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("UTF-8");
        req.setCharacterEncoding("UTF-8");
        doPost(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("UTF-8");
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/htm;charset=UTF-8");
        String action = req.getParameter("action");

        try {
            //获取action业务鉴别字符串,获取相应的业务,方法反射对象
            Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            //通过反射进行调用
            method.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

CookieServlet中创建Cookie的代码:

protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.创建cookie对象
        Cookie cookie = new Cookie("key1","value1");
        //2.通知客户端保存cookie
        resp.addCookie(cookie);
        Cookie cookie1 = new Cookie("key2","value2");
        //2.通知客户端保存cookie
        resp.addCookie(cookie1);
        Cookie cookie2 = new Cookie("key3","value3");
        //2.通知客户端保存cookie
        resp.addCookie(cookie2);
        resp.getWriter().write("Cookie创建成功!");
    }

通过servlet程序我们创建了3个Cookie对象并通过response对象相应给客户通,通知保存Cookie。

示范:

在我们点击了Cookie的创建后:

 这说明我们的servlet程序创建成功

打开开发者模式查看一下cookie:

 cookie确实创建成功并且被浏览器缓存下来了。

2、cookie值的获取

 servlet程序:

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        //服务器得到cookie数组
        Cookie[] cookies = req.getCookies();
        String name  ="key1";
        Cookie iWantCookie = CookieUtils.findCookie(name,cookies);
//        for(Cookie cookie : cookies) {
//            //getName()返回Cookie的名称
//            //getValue()返回Cookie的value值
//            if("key2".equals(cookie.getName()))
//            {
//                iWantCookie = cookie;
//                break;
//            }
//
//        }
        if(iWantCookie != null)
        {
            resp.getWriter().write("找到了需要的cookie");
        }
    }

一般有两种方式得到我们想要的cookie值,一种是使用CookieUtils中的方法,另一种是我们手动循环一遍找到我们想要的cookie

这两种方法都可以,这里我用了使用CookieUtils中的方法得到了key为key1的cookie

示范:

 如图,程序确实运行成功了。

3、Cookie值的更新

servlet程序:

protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //方案一:
//        1.先创建一个需要修改的同名的Cookie对象
//        2.在构造器同时赋予新的Cookie的值
//        Cookie cookie = new Cookie("key1","newValue1");
//        3.调用response.addCookie(cookie): 通知客户端保存修改
//        resp.addCookie(cookie);
//        resp.getWriter().write("key1的Cookie已经修改好了");
//        方案二:
//        1.查到要修改的Cookie对象
        Cookie cookie = CookieUtils.findCookie("key2",req.getCookies());
//        2.调用setValue()方法赋予新的Cookie值
        if(cookie != null)
        {
            cookie.setValue("newValue2");
        }
//        3.调用response.addCookie()通知客户端保存修改
        resp.addCookie(cookie);
    }

有两种方法,一种是先创建一个同名的Cookie对象,构造同时赋予它我们想要的value值,而后通知客户端保存修改,由于key值冲突了,所以后来添加的cookie会把之前的cookie覆盖掉,我们就实现了cookie的更新操作。

方法二是直接使用CookieUtils中的方法,首先得到我们的cookie数组,在cookei数组中找到我们想找的cookei再进行值的设置,最后再通知客户端保存修改实现更新操作即可。

示范:

key2的value确实修改成功了。

4、Cookie的存活周期:

cookie对象有这样的方法设置存活周期:setMaxAge(int second) 传递参数单位是秒

一个cookie对象默认的age是-1,这不代表cookie永远不会被删除,当我们关闭浏览器时这个cookie就会被删除,我们也可以手动为Cookie设置存活时间。

servlet程序:

protected void lifeControl(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //setMaxAge()
        //0表示删除这个Cookie
        //负数表示浏览器一关,Cookie就会被删除(默认值是-1)
        //正数表示在指定的秒数后删除
//        Cookie cookie = new Cookie("defaultLife","defaultLife");
//        cookie.setMaxAge(-1);//设置存活时间
//        resp.addCookie(cookie);

       //删除cookie
//        Cookie cookie = CookieUtils.findCookie("key1",req.getCookies());
//        if(cookie !=null)
//        {
//            cookie.setMaxAge(0);
//            resp.addCookie(cookie);
//            resp.getWriter().write("key1的cookie已经删除!");
//        }

        Cookie cookie = CookieUtils.findCookie("key1",req.getCookies());
        if(cookie !=null)
        {
            cookie.setMaxAge(10);
            resp.addCookie(cookie);
            resp.getWriter().write("key1的cookien 10s后删除!");
        }
    }

不过要记住,当我们获取到我们想要设置存活周期的cookie并且setMaxAge()后,一定要通知客户端保存它,否则无效!

示例:

 当我们点击cookie的存活周期后,我们可以在开发者工具中查看,key1的生命周期确实被设置成了10s

5、路径设置:

首先我来介绍一下cookie的路径作用:假设我们的浏览器有两个cookie他们的路径是这样的:

c1:name=id; value=itcast;     path=/day07_03/
c2:name=name; value=qdmmy6;   path=/day07_03/servlet/

那么当我们访问http://localhost:8080/day07_03/* 时请求头中会包含c1但不会包含c2,

只有当我们访问http://localhost:8080/day07_03/servlet/*时请求头才会包含c2

也就是说,在访问子路径时,会包含其父路径的Cookie,而在访问父路径时,不包含子路径的Cookie。

那么我们如何设置它的路径呢:

protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("path1","path1");
        //req.getContextPath()得到工程路径,再加你要的范围
        cookie.setPath(req.getContextPath());
        resp.addCookie(cookie);
        resp.getWriter().write("创建了一个带有path路径的Cookie");
    }

我们通过调用Cookie中的方法setPath(路径名)来设置这条cookie的路径,同时要注意这里的路径不要写死,使用req.getContextPath()得到工程路径再加上范围。

示范:

 

以上就是关于cookie的知识点,cookie是非常重要的知识点,我们要熟练使用它的方法。

posted @ 2021-09-24 20:44  Apak陈柏宇  阅读(95)  评论(0编辑  收藏  举报