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就会保存用户输入的信息,在一段时间内打开这个网站都不需要重新登录,会直接进入欢迎页。