Cookie是什么?怎么使用

a) 什么是Cookie?

1、Cookie 翻译过来是饼干的意思。

2、Cookie 是服务器通知客户端保存键值对的一种技术。

3、客户端有了Cookie 后,每次请求都发送给服务器。

4、每个Cookie 的大小不能超过4kb

HTTP最大的特点是无连接无状态,使用Cookie和Session的技术就是为了解决这个问题,简单来说,就是让浏览器在一段时间内认识你。

cookie是当你浏览某个网站的时候,由web服务器存储在你的机器硬盘上的一个小的文本文件。它其中记录了你的用户名、密码、浏览的网页、停留的时间等等信息。当你再次来到这个网站时,不用户再次登录,会直接读取cookie中的信息。

b) 如何创建Cookie

创建cookie并且保存到客户端

Cookie cookie = new Cookie("key", "value");

Response对象中的addCookie( )方法会将cookie对象保存到客户端

protected void creatCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //1 创建Cookie对象
    Cookie cookie = new Cookie("username", "尚杰颖");
    //2 通知客户端保存Cookie
    resp.addCookie(cookie);
    //1 创建Cookie 对象
    Cookie cookie1 = new Cookie("password", "021211");
    //2 通知客户端保存Cookie
    resp.addCookie(cookie1);

    resp.getWriter().write("Cookie 创建成功");
}

服务器如何获取Cookie

request.getCookie()方法获取cookies返回的时一个Cookie[]数组

Servlet 程序中的代码:

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //使用request请求对象,来获取客户端传过来的cookie对象
    Cookie[] cookies = req.getCookies(); //返回的是一个cookie数组

    Cookie usernameCookie = CookieUtils.findCookie("username", cookies);
    if (usernameCookie!=null){
        System.out.println("usernameCookie = " + usernameCookie);
    }
    Cookie passwordCookie = CookieUtils.findCookie("password", cookies);
    if (passwordCookie!=null){
        System.out.println("passwordCookie = " + passwordCookie);
    }
    //        if (cookies != null && cookies.length > 0){
    //            for (Cookie cookie : cookies) {
    //                System.out.println(cookie.getName() + " = " + cookie.getValue());
    //            }
    //        }

}

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;
    }

    //创建cookie对象并设置cookie对象有效期
    public static void setCookies(HttpServletResponse resp, String key, String value, int i) {
        if (key != null && value!=null){
            //创建cookie对象
            Cookie cookie = new Cookie(key,value);
            //设置cookie对象有效期
            cookie.setMaxAge(i);
            //将cookie添加到响应对象中,保存到浏览器上
            resp.addCookie(cookie);
        }
    }
}

c) 浏览器查看Cookie:

d) Cookie 生命控制

Cookie 的生命控制指的是如何管理Cookie 什么时候被销毁(删除)

setMaxAge()

1.正数,表示在指定的秒数后过期

2.负数,表示浏览器一关,Cookie 就会被删除(默认值是-1)

3.零,表示马上删除Cookie

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

马上删除一个Cookie

先将我们需要删除的cookie对象获取到,再调用setMaxAge()方法里面设置参数0,调用response.addCookie()方法,写入浏览器,此时浏览器会立刻删除该cookie数据

protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 先找到你要删除的Cookie 对象
    Cookie cookie = CookieUtils.findCookie("life3600_key", req.getCookies());
    if (cookie != null) {
    // 调用setMaxAge(0);
        cookie.setMaxAge(0); // 表示马上删除,都不需要等待浏览器关闭
    // 调用response.addCookie(cookie);
        resp.addCookie(cookie);
        resp.getWriter().write("key4 的 Cookie 已经被删除");
    }

}

e) 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 发送

创建一个带有Path路径的cookie

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

该方法是指,只有在路径为/工程路径/abc/的地址下,cookie才会发送。

创建一个Servlet类:AbcCookieServlet测试

@WebServlet("/abc/CookieServlet")
public class AbcCookieServlet extends ModelBaseServlet {
    protected void getAllCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        if (cookies != null){
            for (Cookie cookie : cookies) {
                if (cookie != null){
                    System.out.println(cookie.getName() + " : " + cookie.getValue());
                }
            }
        }
    }
}

@WebServlet("/abc/CookieServlet")

这行代码是在Java web应用程序中使用Servlet技术创建一个名为"CookieServlet"的Servlet,并将其映射到URL路径"/abc/CookieServlet"上。这意味着当用户访问"/abc/CookieServlet"路径时,将会触发该Servlet的处理逻辑。

在另一个servlet类中也创建一个同样的方法

protected void getAllCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Cookie[] cookies = req.getCookies();
    if (cookies != null){
        for (Cookie cookie : cookies) {
            if (cookie != null){
                System.out.println(cookie.getName() + " : " + cookie.getValue());
            }
        }
    }
}

其注解是@WebServlet("/CookieServlet")

页面代码如下:

运行该项目,先点击第一个a标签,创建一个带有path路径的cookie。

此时这个cookie会发送给哪个Servlet ? 答案是发送给带有cookie的path路径的Servlet。cookie的path 属性是通过请求的地址来进行有效的过滤。选择发送给哪些服务器。

f) Cookie应用--免输入用户名登录网站

Cookie技术可用于,网站免输入用户名登录。Cookie可设置管理销毁时间,假设设置成一周、一个月,那么用户登录的用户名会在Cookie中保存设定的时间,在此期间内打开该网页都不必重新登录,类似b站、淘宝网、优酷网等都是使用此技术实现免登录功能。

1、一个项目的前端登录注册页面

重点部分:单选框,<input type="checkbox" name="remember" value="1">记密码。勾选此选项表示需要cookie保存输入键值对。value=1

后端获取到值String remember = req.getParameter("remember"); 判断该值是否为"1"则

if (remember != null && remember.equals("1")){
    CookieUtils.setCookies(resp,"username",persistentUser.getUsername(),60*60*24*30);
    CookieUtils.setCookies(resp,"password",persistentUser.getPassword(),60*60*24*30);
}

调用工具类中的setCookie方法,创建并设置cookie生命周期

启动服务器来到登录页面

登录时选择记住密码,再登录时Cookie就会保存用户输入的信息,在一段时间内打开这个网站都不需要重新登录,会直接进入欢迎页。

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值