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("登陆失败");
}
}
}