目录
-
什么是Cookie?
-
Cookie直译是饼干的意思
-
Cookie是服务器通知客户端保存键值对的一种技术。是servlet发送到Web浏览器的少量信息。
-
客户端有了Cookie后,每次请求都会发送给服务器
-
每个Cookie的大小不能超过4kb
-
-
Cookie的值
-
值的内容不能包括:空格、方括号、圆括号、等号、逗号、双引号、斜杠、问号、@、冒号、分号
-
值能否为空格,需要根据浏览器的来判断
-
如果需要使用这些字符,则需要使用BASE64编码
-
-
创建Cookie
// 创建Cookie
protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、创建Cookie对象
Cookie cookie1 = new Cookie("key1", "value1");
// 2、通知客户端保存Cookie
resp.addCookie(cookie1);
// 1、创建Cookie对象
Cookie cookie2 = new Cookie("key2", "value2");
// 2、通知客户端保存Cookie
resp.addCookie(cookie2);
// 在屏幕上输出提示
resp.getWriter().write("Cookie创建成功");
}
-
获取Cookie
-
代码
-
获取Cookie的代码
-
-
// 获取Cookie
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取全部的Cookie,存储在一个数组里
Cookie[] cookies = req.getCookies();
// 创建一个Cookie对象,用来存储找到的指定key的Cookie
Cookie iWantCookie = null;
// // 遍历数组,取出每一个Cookie打印出来
// // 需要查找某个Cookie,需要通过遍历来查找(没有封装方法,可以自己封装)
// for (Cookie cookie : cookies) {
// // 打印每一个Cookie
// // getName()方法:返回Cookie的key(名); getValue()方法:返回Cookie的value(值)
// resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br>");
//
// // 所指定的key为key2
// if ("key2".equals(cookie.getName())) {
// iWantCookie = cookie;
// // break;//单纯找某个key的Cookie,则找到之后可以跳出循环
// }
// }
// 使用封装的方法来取出指定key的Cookie
iWantCookie = CookieUtils.findCookie("key2", cookies);
// 如果iWantCookie不为null,说明找到了该Cookie,为null则没有找到
if (iWantCookie != null) {
resp.getWriter().write("<br> 找到了需要找的Cookie");
}
}
-
封装获取指定key的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对象
-
在构造器中同时赋予新的Cookie值
-
调用response.addCookie(Cookie)通知客户端保存
-
-
方案二:直接修改法
-
先查找到需要修改的Cookie对象
-
调用setValue()方法赋予新的Cookie值
-
调用response.addCookie(Cookie)通知客户端保存
-
-
// 修改Cookie
protected void updataCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// // 方案一:覆盖法
// // 1、先创建一个要修改的同名Cookie对象;2、在构造器中同时赋予新的Cookie值
// Cookie cookie = new Cookie("key1", "newValue1");
// // 3、调用response.addCookie(Cookie);通知客户端保存修改
// resp.addCookie(cookie);
// 方案二:直接修改法
// 1、先查找到需要修改的Cookie对象.findCookie()是自己封装的方法
Cookie cookie1 = CookieUtils.findCookie("key1", req.getCookies());
if (cookie1 != null) {
// 2、调用setValue()方法赋予新的Cookie值
cookie1.setValue("newValue1");
// 3、调用response.addCookie(Cookie)通知客户端保存
resp.addCookie(cookie1);
}
resp.getWriter().write("key1的Cookie已经修改!");
}
-
谷歌浏览器查看Cookie
-
按F12
-
-
Cookie生命控制(删除)
-
Cookie的生命控制指的是如何管理Cookie什么时候被销毁(删除)
-
setMaxAge()方法设置生命周期
-
默认值是-1
-
setMaxAge(正值):表示在指定的秒数之后过期
-
setMaxAge(负值):表示浏览器一关,Cookie就会被删除
-
setMaxAge(0):表示马上删除Cookie
-
-
代码展示
-
设置Cookie在浏览器关闭时删除
-
-
// 设置Cookie在浏览器关闭时删除
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建一个Cookie对象
Cookie cookie = new Cookie("defaultLife", "defaultLife");
// 设置该Cookie的存活时间
cookie.setMaxAge(-1);// 设置存活时间:负值,浏览器关闭时删除
// 通知客户端保存该Cookie
resp.addCookie(cookie);
}
-
删除某个Cookie
// 删除某个Cookie
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、先找到要删除的Cookie对象
Cookie cookie = CookieUtils.findCookie("key1", req.getCookies());
if (cookie != null) {
// 2、调用setMaxAge()方法修改存活时间
cookie.setMaxAge(0);// 参数为0,表示立即删除该Cookie对象
// 3、调用response.addCookie(Cookie)通知客户端保存
resp.addCookie(cookie);
resp.getWriter().write("key1的Cookie已经被删除");
}
}
-
设置Cookie存活一小时
// 设置Cookie存活一小时
protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("life3600", "life3600");
cookie.setMaxAge(60 * 60);
resp.addCookie(cookie);
resp.getWriter().write("已经创建了一个存活一小时的Cookie");
}
-
Cookie的path属性
-
Cookie的path属性可以有效地过滤哪些Cookie可以发送给服务器,哪些不发送
-
path通过请求的地址来进行有效的过滤
-
默认的path是当前的路径
-
举例:
-
CookieA path=/工程路径
-
CookieB path=/工程路径/abc
-
请求地址1:http://ip:port/工程路径/a.html
-
CookieA 发送
-
CookieB 不发送
-
-
请求路径2:http://ip:port/工程路径/abc/a.html
-
CookieA 发送
-
CookieB 发送
-
-
-
// 设置Cookie的path
protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("path1", "path1");
// 设置path
// getContextPath()方法可以工程路径
cookie.setPath(req.getContextPath() + "/abc");// ---> /工程路径/abc
resp.addCookie(cookie);
resp.getWriter().write("创建了一个带有Path路径的Cookie");
}
-
免用户名登陆
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 ("wzg168".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("登陆失败!");
}
}
}