Cookie饼干
Cookie简介
什么是Cookie?
答:Cookie是服务器同志客户端保存键值对的一种技术,客户端有了Cookie后,每次请求都会发送给服务器。每个Cookie的大小都不能超过4kb。
Cookie有关操作
Cookie的创建
Cookie的创建流程如下所示
说明:Cookie是服务器中Servlet程序创建并通过response
返回给客户端浏览的的键值对信息。在服务器中需要执行两个关键的操作:
//1 创建Cookie对象
Cookie cookie = new Cookie("key0", "v0");
Cookie cookie1 = new Cookie("key1", "v1");
Cookie cookie2 = new Cookie("key2", "v2");
//2 通知客户端保存Cookie
response.addCookie(cookie);
response.addCookie(cookie1);
response.addCookie(cookie2);
response.getWriter().write("Cookie 创建 ");
如果不执行response.addCookie(cookie)
,浏览器将无法知道服务器创建了cookie,可以在浏览器的检查中查看到Cookies信息
Cookie的获取
cookie获取的流程图
服务器获取客户端的Cookie只需要一行代码
protected void getCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
Cookie iWannaCookie = CookieUtils.findCookie("key1", cookies);}
// 如果不等于null,说明赋过值,也就是找到了需要的Cookie
if (iWannaCookie != null) {
response.getWriter().write("OK 找到了!cookie : " + iWannaCookie.getName() + " = " + iWannaCookie.getValue() + "<br/>");
}
}
查找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) {
// 如果找到了cookie
if (name.equals(cookie.getName())) {
return cookie;
}
}
return null;
}
}
Cookie值的修改
方案一:(创重名再发送)
- 先创建一个要修改的同名的Cookie对象
- 在构造器,同时赋予新的Cookie值
- 调用
response.addCookie(Cookie);
方案二:(找目标重复值)
- 先查找到需要修改的Cookie对象
- 调用
setValue()
方法赋予新的Cookie值 - 调用
response.addCookie()
通知客户端保存修改
protected void updateCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//方案一:
//1、先创建一个要修改的同名的Cookie对象
//2、在构造器,同时赋于新的Cookie值。
Cookie cookie = new Cookie("key1","newValue1");
//3、调用response.addCookie( Cookie ); 通知 客户端 保存修改
resp.addCookie(cookie);
//方案二:
//1、先查找到需要修改的Cookie对象
Cookie cookie = CookieUtils.findCookie("key1", request.getCookies());
if (cookie != null) {
//2、调用setValue()方法赋于新的Cookie值。
cookie.setValue("newV1");
//3、调用response.addCookie()通知客户端保存修改
response.addCookie(cookie);
}
response.getWriter().write(" ok方案2 ");
}
⚠️ cookie值不支持符号以及中文
Cookie的生命周期
Cookie的声明控制是指如何管理Cookie什么时候被删除
设置Cookie生命周期为默认值
/**
* 默认的会话级别的Cookie
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void defaultLifeCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("d1", "d1v1");
cookie.setMaxAge(-1);//设置存活时间
response.addCookie(cookie);
}
设置Cookie生命周期为立即删除
/**
* 马上删除一个Cookie
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void deleteNowCookie(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("删除 k1 ");
}
设置Cookie生命周期为一个小时
/**
* 设置存活1个小时的Cooie
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void life3600Cookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("life", "life3600");
cookie.setMaxAge(60 * 60);// 设置Cookie一小时之后被删除。无效
response.addCookie(cookie);
response.getWriter().write("已经创建了一个存活一小时的Cookie");
}
Cookie有效路径Path的设置
Cookie的path属性可以有效的过滤那些Cookie可以发给服务器,那些不发。path属性是通过请求的地址来进行有效过滤
protected void pathCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("path1", "pathCookie1");
// getContextPath() ===>>>> 得到工程路径
cookie.setPath(request.getContextPath() + "/abc");// ===>>>> /工程路径/abc
response.addCookie(cookie);
response.getWriter().write("创建了一个带有Path路径的Cookie");
}
练习:免用户名登陆
免用户名登陆的细节原理及细节
类加载失败的可能的原因
- web.xml出问题(过滤器+路径写错)
- tomcat以及javaEE版本不匹配
- artifacts中数据缓存,删除artifacts并重新添加