Java web学习day12 Cookie

Cookie

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

Cookie的创建

在这里插入图片描述
在这里插入图片描述

package com.test;

import javax.servlet.ServletException;
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 req, HttpServletResponse resp) throws ServletException, IOException {
          //1.创建Cookie对象
          Cookie cookie=new Cookie("key1","value1");
          //2.通知客户端保存Cookie
          resp.addCookie(cookie);
          resp.getWriter().write("Cookie创建成功");
          //可以一次创建多个Cookie
    }
}

Cookie保存在客户端

<li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
<li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li>
<li><a href="cookieServlet?action=updateCookie" target="target">Cookie值的修改</a></li>

服务器如何获取Cookie

在这里插入图片描述

package com.test;

import com.utils.CookieUtils;

import javax.servlet.ServletException;
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 req, HttpServletResponse resp) throws ServletException, IOException {
          //1.创建Cookie对象
          Cookie cookie1=new Cookie("key1","value1");
          Cookie cookie2=new Cookie("key2","value2");
          //2.通知客户端保存Cookie
          resp.addCookie(cookie1);
          resp.addCookie(cookie2);
          resp.getWriter().write("Cookie创建成功");
    }
    protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          Cookie[] cookies = req.getCookies();
          Cookie iWantCookie= CookieUtils.findCookie("key1",cookies);
          
    }
}

package com.utils;

import javax.servlet.http.Cookie;

public class CookieUtils {
    //查找指定名称的Cookieduix
    public static Cookie findCookie(String name, Cookie[]cookies){
        if(name==null||cookies==null|| cookies.length==0){
            return null;
        }

        //没有提供直接获取一个Cookie的方法,只能用遍历+判断

        for(Cookie cookie:cookies){
            //getName方法返回Cookie的key
            //getValue方法返回Coookie的value值
            // resp.getWriter().write("Cookie["+cookie.getName()+"]="+cookie.getValue()+"\n");
            if(name.equals(cookie.getName())){
               return cookie;

            }
        }
        return null;


    }
}

Cookie值的修改

方案一:
1、先创建一个要修改的同名(指的就是 key)的 Cookie 对象
2、在构造器,同时赋于新的 Cookie 值。
3、调用 response.addCookie( Cookie );

 protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
//        方案一:
//        1、先创建一个要修改的同名(指的就是 key)的 Cookie 对象
          Cookie cookie=new Cookie("key1","newvalue1");
//        2、在构造器,同时赋于新的 Cookie 值。
          //通知客户端保存修改
          resp.addCookie(cookie);
//        3、调用 response.addCookie( Cookie );
          resp.getWriter().write("key1的Cookie已经修改好");


    }

方案二:
1、先查找到需要修改的 Cookie 对象
2、调用 setValue()方法赋于新的 Cookie 值。
3、调用 response.addCookie()通知客户端保存修改

protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Cookie[] cookies = req.getCookies();

//          方案二:
//          1、先查找到需要修改的 Cookie 对象
            Cookie cookie=CookieUtils.findCookie("key2", cookies);
//          2、调用 setValue()方法赋于新的 Cookie 值。
            if(cookie!=null){
                   cookie.setValue("newValue2");
                   //不支持中文,如果想支持中文必须使用BASE64编码
            }
//          3、调用 response.addCookie()通知客户端保存修改
            resp.addCookie(cookie);
            resp.getWriter().write("key2的Cookie已经修改好");


    }
}

查看Cookie

F12
在这里插入图片描述

Cookie的生命控制

指的是如何管理Cookie什么时候被销毁
setMaxAge()
默认值为-1
public void setMaxAge(int expiry)
设置 cookie 的最大生存时间,以秒为单位。
正值
表示 cookie 将在经过该值表示的秒数后过期。注意,该值是 cookie 过期的最大 生存时间,不是 cookie 的当前生存时间。
负值–Seession
意味着 cookie 不会被持久存储,将在 Web 浏览器退出时删除。
0 值
马上删除 cookie

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<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">
<title>Cookie</title>
	<base href="http://localhost:8080/12_Cookie/"/>
<style type="text/css">

	ul li {
		list-style: none;
	}
	
</style>
</head>
<body>
	<iframe name="target" width="500" height="500" style="float: left;"></iframe>
	<div style="float: left;">
		<ul>
			<li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
			<li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li>
			<li><a href="cookieServlet?action=updateCookie" target="target">Cookie值的修改</a></li>
			<li>Cookie的存活周期</li>
			<li>
				<ul>
					<li><a href="cookieServlet?action=defaultLife" target="target">Cookie的默认存活时间(会话)</a></li>
					<li><a href="cookieServlet?action=deleteNow" target="target">Cookie立即删除</a></li>
					<li><a href="cookieServlet?action=life3600" 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>
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie=new Cookie("key3","defaultLife");
        if(cookie!=null) {
            cookie.setMaxAge(-1);//设置存活时间
            resp.addCookie(cookie);//调用后才能生效

        }
    }
    protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie=new Cookie("key4","defaultLife");
        if(cookie!=null) {
            cookie.setMaxAge(0);//设置存活时间,0表示马上删除
            resp.addCookie(cookie);
            resp.getWriter().write("k4的Cookie已经被删除");
        }
    }
    protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie=new Cookie("key7","defaultLife");
        if(cookie!=null) {
            cookie.setMaxAge(3600);//设置存活时间,3600s
            resp.addCookie(cookie);
            resp.getWriter().write("已经创建了一个存活1h的Cookie");
        }
    }

在这里插入图片描述

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

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

在这里插入图片描述

练习 免用户名登录

实现细节
在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
     <form action="http://localhost:8080/12_Cookie/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>

package com.test;

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

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if("ddd".equals(username)&&"123456".equals(password)){
            //登陆成功
            Cookie cookie=new Cookie("username",username);
            cookie.setMaxAge(60*60*24*7);//当前Cookie一星期内有效
            resp.addCookie(cookie);
            System.out.println("登陆成功");


        }else{
            //登陆失败
            System.out.println("登陆失败");
        }

    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值