Cookie学习笔记

29 篇文章 0 订阅

1.什么是Cookie

1)Cookie翻译过来是饼干的意思
2)Cookie是服务器通知客户端保存键值对的一种技术
3)客户端有了Cookie后,每次请求都发送给服务器
4)每个Cookie的大小不超过4kb

2.如何创建Cookie

我们创建一个包,假设命名为com.bjpowernode,在这个包下,创建两个文件,一个BaseServlet.java,一个CookieServlet.java

package com.bjpowernode;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

public class BaseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
        //解决post请求中文乱码问题
        //一定要在获取请求参数之前调用才有效
        request.setCharacterEncoding("UTF-8");
        //解决响应中文乱码问题
        response.setContentType("text/html;charset=UTF-8");
        String action=request.getParameter("action");
        try{
            //获取action业务鉴别字符串,获取相应的业务,方法反射对象
            Method method=this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            //调用目标业务,方法
            method.invoke(this,request,response);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    @Override
    protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        //解决post请求中文乱码问题
        //一定要在获取请求参数之前调用才有效
        request.setCharacterEncoding("UTF-8");
        //解决响应中文乱码问题
        response.setContentType("text/html;charset=UTF-8");
        String action=request.getParameter("action");
        try{
            //获取action业务鉴别字符串,获取相应的业务,方法反射对象
            Method method=this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            //调用目标业务,方法
            method.invoke(this,request,response);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CookieServlet extends BaseServlet{
    protected  void createCookie(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{
        System.out.println("cookie创建成功");
        //1.创建Cookie对象
        Cookie cookie=new Cookie("key1","value1");
        //2.通知客户端保存Cookie
        response.addCookie(cookie);
        response.getWriter().write("Cookie创建成功");
        System.out.println("cookie创建成功");
    }
}

配置web.xml,然后创建一个cookie.html,代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="pragma" content=""no-cache>
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="Expires" content="0">
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <meta charset="UTF-8">
    <title>Cookie</title>
    <base href="http://localhost:8080/Maven7/">
    <style type="text/css">
        ul li{
            list-style:none;
        }
    </style>
</head>
<body>
    <iframe name="target" width="400" height="400" style="..."></iframe>
    <div style="...">
        <ul>
            <li><a href="cookieServlet?action=createCookie" target="target" method="post">Cookie的创建</a></li>
            <li><a href="" target="target">Cookie的获取</a></li>
            <li><a href="" target="target">Cookie值的修改</a></li>
            <li>Cookie的存活周期</li>
            <li>
                <ul>
                    <li><a href="" target="target">Cookie的默认存活时间(会话)</a></li>
                     <li><a href="" target="target">Cookie立即删除</a></li>
                     <li><a href="" target="target">Cookie存活3600秒(1小时)</a></li>
                </ul>
            </li>
            <li><a href="" target="target">Cookie的路径设置</a></li>
            <li><a href="" target="target">Cookie的用户登录联系</a></li>
        </ul>
    </div>
</body>
</html>

运行Tomcat,进入cookie.html页面,然后打开调试器,进入应用程序选项
在这里插入图片描述
点击Cookie的创建
结果如下:
在这里插入图片描述
点击网络,如图
在这里插入图片描述
点击cookieServlet?action=createCookie,点击标头
在这里插入图片描述
看到set-cookie:key1=value1,一开始客户端没有Cookie,然后客户端向服务器请求,那么服务器先创建Cookie对象,然后通知客户端保存Cookie,然后通过响应头set-Cookie通知客户端保存Cookie,浏览器收到响应后,发现有set-cookie响应头,就去查看有没有这个cookie,没有就创建一个cookie,有就修改
在这里插入图片描述

3.服务器获取Cookie

服务器获取客户端的Cookie只需要一行代码:
request.getCookies():Cookie[]
我们创建修改Cookie.Servlet,代码如下:

public class CookieServlet extends BaseServlet{
    //创建Cookie
    protected  void createCookie(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{
        System.out.println("cookie创建成功");
        //1.创建Cookie对象
        Cookie cookie=new Cookie("key1","value1");
        //2.通知客户端保存Cookie
        response.addCookie(cookie);
        response.getWriter().write("Cookie创建成功");
        System.out.println("cookie创建成功");
    }
    //获取Cookie
    protected  void getCookie(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        System.out.println("cookie的获取");
        Cookie[]cookies=request.getCookies();
        for(Cookie cookie:cookies){
            //getName方法返回Cookie的key(名)
            //getValue方法返回Cookie的value值
            response.getWriter().write("Cookie["+cookie.getName()+"="+cookie.getValue()+"]<br>");
        }
    }
}

修改cookie.html

  <li><a href="cookieServlet?action=createCookie" target="target" method="post">Cookie的创建</a></li>
            <li><a href="cookieServlet?action=getCookie" target="target" method="post">Cookie的获取</a></li>

结果如下:
在这里插入图片描述
打开网络,查看如下:
在这里插入图片描述
客户端有Cookie:key1=value1,通过请求头,Cookie把cookie信息发送给服务器,服务器获取客户端发送过来的Cookie.
在这里插入图片描述

我们没有方法通过key值直接获取想要的Cookie,故只能通过遍历来获取

 protected  void getCookie(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        System.out.println("cookie的获取");
        //获取所有Cookie
        Cookie[]cookies=request.getCookies();
        Cookie iwantCookie=null;
        for(Cookie cookie:cookies) {
            //getName方法返回Cookie的key(名)
            //getValue方法返回Cookie的value值
            //response.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br>");
            if("key1".equals(cookie.getName())){
                iwantCookie=cookie;
                break;
            }
        }
        //如果不等于null,说明找到了需要的cookie
        if(iwantCookie!=null){
            response.getWriter().write("找到了需要的Cookie");
        }
    }

结果如下:
在这里插入图片描述
因为这个查找Cookie经常要用到,所有我们把它弄到一个工具类中,我们创建一个包,假设命名为com.util,在这个包下创建一个CookieUtils.java类,代码如下:

package com.util;

import javax.servlet.http.Cookie;

public class CookieUtils {
    /**
     * 查找指定名称的Cookie对象
     * @param name
     * @param cookies
     * @return
     */
    public static Cookie findCookie(String name,Cookie[]cookies){
        if(name==null||cookies==null||cookies.length==0)
            return null;
        for(Cookie cookie:cookies){
            if(name.equals(cookie.getName())){
                return cookie;
            }
        }
        return null;
    }
}

修改CookieServlet.java代码

 //获取Cookie
    protected  void getCookie(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        System.out.println("cookie的获取");
        //获取所有Cookie
        Cookie[]cookies=request.getCookies();
        Cookie iwantCookie= CookieUtils.findCookie("key1",cookies);
        //如果不等于null,说明找到了需要的cookie
        if(iwantCookie!=null){
            response.getWriter().write("找到了需要的Cookie");
        }
    }

4.Cookie值的修改

方案一:
1.创建一个要修改的同名的Cookie对象
2.在构造器中,同时赋予新的Cookie值
3.调用response.addCookie(Cookie);
我们在CookieServlet.java中添加方法

//修改Cookie
    protected void updateCookie(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        //方案一:
        //1.创建一个要修改的同名的Cookie对象
        Cookie cookie=new Cookie("key1","newValue1");
        //2.在构造器中,同时赋予新的Cookie值
        response.addCookie(cookie);
        //3.调用response.addCookie(Cookie);
        response.getWriter().write("key1已经修改");

    }

配置cookie.html,然后运行Tomcat,结果如下
在这里插入图片描述
方案二:
1.先查找到需要修改的Cookie对象
2.调用setValue方法赋予新的Cookie值
3.调用resopnse.addCookie()通知客户端保存修改
我们修改updateCookie方法

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

结果如下:
在这里插入图片描述

5.Cookie的生命控制

Cookie的生命控制指的是如何管理Cookie什么时候被销毁
setMaxAge(int)
正数:表示在指定的秒数后过期
负数:表示浏览器一关,Cookie就会被删除(默认值是-1)
零:表示马上删除Cookie
我们在CookieServlet.java添加defaultLife方法

//默认生命周期
    protected void defaultLife(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        Cookie cookie=new Cookie("defaultLife","defaultLife");
        cookie.setMaxAge(-1);//设置存活时间
        response.addCookie(cookie);
    }

修改cookie.html,运行Tomcat
在这里插入图片描述
我们关闭浏览器,在重新打开,结果如下:
在这里插入图片描述
我们在CookieServlet.java中添加deleteNow方法,代码如下

 //马上删除
    protected void deleteNow(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        //先找到要删除的Cookie对象
        Cookie cookie=CookieUtils.findCookie("key1",request.getCookies());
        if(cookie!=null){
            //调用setMaxAge(0);
            cookie.setMaxAge(0);
            //调用response.addCookie(cookie)
            response.addCookie(cookie);
            response.getWriter().write("key1的Cookie已经被删除");
        }
    }

修改cookie.html,先点击创建Cookie,
在这里插入图片描述
再点击Cookie立即删除
在这里插入图片描述
我们在CookieServlet.java添加life3600方法,代码如下:

//存活1小时
    protected void life3600(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        Cookie cookie=new Cookie("life3600","life3600");
        cookie.setMaxAge(60*60);//设置Cookie一小时后被删除,无效
        response.addCookie(cookie);
        response.getWriter().write("已经创建一个存活一小时的Cookie");
    }

修改cookie.html,运行Tomcat,结果如下:在这里插入图片描述
这个Cookie在一小时后被删除,关闭浏览器也不会删除

6.Cookie有效路径path的设置

Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器,哪些不能,path属性是通过请求的地址来进行有效的过滤,如:
CookieA path=/工程路径
CookieB path=/工程路径/abc
请求地址如下:
http://ip:port/工程路径/a.html
CookieA发送
CookieB不发生
http://ip:port/工程路径/abc/a.html
CookieA发送
CookieB发送
我们在CookieServlet.java添加testPath方法,代码如下:

  //设置路径path
    protected void testPath(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        Cookie cookie=new Cookie("path1","path1");
        //getContextPath()==>>得到工程路径
        cookie.setPath(request.getContextPath()+"/abc");//==>>/工程路径/abc
        response.addCookie(cookie);
        response.getWriter().write("创建了一个带有路径的Cookie");
    }

修改cookie.html,运行Tomcat,结果如下:
在这里插入图片描述
我们没发现我们工程所创建的path1,我们打开网络,点击cookieServlet?action=testPath,看见set-cookie:path1=path1;Path=/Maven7/abc,说明刚才确实有创建path1
在这里插入图片描述
而我们浏览器的地址栏中是:
http://localhost:8080/Maven7/cookie.html
我们在地址栏中输入:
http://localhost:8080/Maven7/abc/cookie.html
结果如下:
在这里插入图片描述
此时看得到path1

7.Cookie练习–免输入用户名登录

第一次登录时,将用户名保存为Cookie发送给服务器,第二次登录时无需输入,会把Cookie发送个服务器,从而实现免密登录
在这里插入图片描述
我们创建一个LoginServlet.java,代码如下:

import java.io.IOException;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        //比较用户名和密码是否正确,这里不连接数据库了,为了方便演示,直接写出固定的
        if("cxy".equals(username)&&"123456".equals(password)){
            //登录成功
            Cookie cookie=new Cookie("username",username);
            cookie.setMaxAge(60*60*24);//当前Cookie一天内有效
            response.addCookie(cookie);
            System.out.println("登录成功");
        }else{
            //登录失败
            System.out.println("登录失败");
        }
    }
}

创建一个login.jsp,代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="http://localhost:8080/Maven7/loginServlet" method="get">
        用户名:<input type="text" name="username" value="${cookie.username.value}"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

修改web.xml配置,然后运行Tomcat
我们先输入错误的密码
在这里插入图片描述
关闭浏览器在重新打开,此时不显示用户名
在这里插入图片描述
我们输入正确的用户名和密码,关闭后重新打开,此时显示用户名:
在这里插入图片描述
同理可以设置免密码输入

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值