浏览器Cookie

  • Cookie(曲奇饼干)是浏览器保存在本地的文本内容
  • Cookie常用于保存登录状态、用户资料等小文本
  • Cookie具有时效性,Cookie内容会伴随请求发送给Tomcat
  • 默认没有设置cookie时效性的情况下,cookie的有效期就是为当前浏览器窗口

Cookie的例子

例如一个平常登录的一个网站,如果选择”7天内自动登录”,登录后,关闭浏览器;重新打开浏览器,会发现登录状态并没有消失

底层的原理:利用Cookie技术,存放了用户的登录信息;浏览器二次访问时,浏览器会把Cookie中存放的用户登录信息提取出来,并通知服务器说之前这个用户已经登录过了,并不需要重新登录

image-20220423212850398

存放Cookie的文件放在哪里

img

img

设置Cookie示例

向浏览器发送cookie

设置Cookie,并将Cookie信息随着response(响应)发回到浏览器端;浏览器将这个Cookie信息保存到本地的文件中;之后每一次请求,request(请求对象)都会包含这个Cookie信息,一并发送到对应的地址上。所以要先设置发送到浏览器cookie值(respone),然后的请求就带有cookie值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.java.servlet.cookie;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "LoginServlet", value = "/cookies/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("用户登录成功");

//cookie的核心方法,第一个参数是cookie的名称,第二个参数是在cookie中要保存的数据
Cookie cookie = new Cookie("user","admin");//创建cookie

//如果想让Cookie保存在客户端浏览器(中,需要调用下面的addCookie()方法
response.addCookie(cookie);//在客户端浏览器中增加名字为user值为admin的Cookie
response.getWriter().println("Login success");//页面上输出Login Success
}

image-20220424140611052

查看Cookie是否生效,在浏览器中F12查看

可以看到图片中的**user:”admin”**这个的含义是:对于当前的浏览器来说,每次发送请求的时候,都会将user=admin随着请求一并发送到Tomcat服务器上

1401

服务器获取cookie

直接上代码演示

服务器先向浏览器上发送cookie(response),并保存在本地,之后的每一次浏览器请求都带有这个cookie的值,所以必须先登录让浏览器端之后的请求中带有cookie值,然后服务器端才可以获取到cookie的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.java.servlet.cookie;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "LoginServlet", value = "/cookies/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("用户登录成功");

//cookie的核心方法,第一个参数是cookie的名称,第二个参数是在cookie中要保存的数据
Cookie cookie = new Cookie("user","admin");

//如果想让Cookie保存在客户端浏览器中,需要调用下面的addCookie()方法
response.addCookie(cookie);//在客户端浏览器中增加名字为user值为admin的Cookie
response.getWriter().println("Login success");//页面上输出Login Success
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.java.servlet.cookie;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "LoginIndexServlet", value = "/cookies/index")
public class LoginIndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//getCookies()方法,获取请求中的Cookie信息,集合的形式
Cookie[] cs =request.getCookies();
String user=null;
for (Cookie c:cs){
//c.getName():获取Cookie名称;c.getValue:获取Cookie的值
System.out.println(c.getName()+":"+c.getValue());
if (c.getName().equals("user")){//判断cookie的user的值是否为user,如果是,则获取到user的value值
user=c.getValue();
break;
}
}
if (user==null){//如果获取到的cookie的
response.getWriter().println("user not login");
}
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

1845

Cookie的时效性

当Cookie没有设置有效期时,Cookie的有效期就是当前的浏览器窗口:

在上面的例子中,我们先访问了LoginServlet这个Servlet,我们是在这个Servlet中设置增加的Cookie,然后在没有关闭浏览器的情况下,又访问了IndexServlet这个Servlet,在这个Servlet中我们访问了Cookie并获取到Cookie的值

其实是因为我们没有关闭浏览器,所以在LoginServlet设置Cookie信息会有效,IndexServlet能支持访问到Cookie的信息,但一旦,我们关闭了浏览器,重新打开浏览器,直接访问IndexServlet时,会报错,Cookie失效了

1915

但是这里的报错是空指针异常,就是没有cookie值,cookie数组是空的(因为所有的Cookie信息都失效了),会引发空指针异常

1921

可以将上面的程序更改一下,增强健壮性

1934

没有访问LoginServlet的情况下,访问IndexServlet,就会输出user not login

image-20220425193558361

设置Cookie时效性

2032

先访问LoginServlet,先让浏览器将cookie信息保存,让后面request请求中带有cookie信息

image-20220425200041766

关闭浏览器:然后重新启动Tomcat服务,访问IndexServlet:结果是发现Cookie并没有因为关闭浏览器而失效,因为我们把其时效性设置为7天

image-20220425202552895


注解

  1. cookie(大概率)也是浏览器自动创建的,浏览器会在本地创建一个存放所有Cookie对象的列表:然后我们也可以通过
    Cookie cookie = new Cookie(“user”,”admin”); 自己创建一个cookie,然后通过response.addCookie(cookie); 响应返回浏览器,然后浏览器会把这个返回cookie添加到自己维护的cookie列表中; 然后通过Cookie[] cs = request.getCookies(); 获取所有cookie列表
  2. 换句话说,Cookie是浏览器创建和维护的;这是个特殊的Java对象,这些对象有很多属性和方法,我们可以按需调用