浏览器Cookie
- Cookie(曲奇饼干)是浏览器保存在本地的文本内容
- Cookie常用于保存登录状态、用户资料等小文本
- Cookie具有时效性,Cookie内容会伴随请求发送给Tomcat
- 默认没有设置cookie时效性的情况下,cookie的有效期就是为当前浏览器窗口
Cookie的例子
例如一个平常登录的一个网站,如果选择”7天内自动登录”,登录后,关闭浏览器;重新打开浏览器,会发现登录状态并没有消失
底层的原理:利用Cookie技术,存放了用户的登录信息;浏览器二次访问时,浏览器会把Cookie中存放的用户登录信息提取出来,并通知服务器说之前这个用户已经登录过了,并不需要重新登录
存放Cookie的文件放在哪里
设置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 = new Cookie("user","admin"); response.addCookie(cookie); response.getWriter().println("Login success"); }
|
查看Cookie是否生效,在浏览器中F12查看
可以看到图片中的**user:”admin”**这个的含义是:对于当前的浏览器来说,每次发送请求的时候,都会将user=admin随着请求一并发送到Tomcat服务器上
服务器获取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 = new Cookie("user","admin");
response.addCookie(cookie); response.getWriter().println("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 { Cookie[] cs =request.getCookies(); String user=null; for (Cookie c:cs){ System.out.println(c.getName()+":"+c.getValue()); if (c.getName().equals("user")){ user=c.getValue(); break; } } if (user==null){ response.getWriter().println("user not login"); } }
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
} }
|
Cookie的时效性
当Cookie没有设置有效期时,Cookie的有效期就是当前的浏览器窗口:
在上面的例子中,我们先访问了LoginServlet这个Servlet,我们是在这个Servlet中设置增加的Cookie,然后在没有关闭浏览器的情况下,又访问了IndexServlet这个Servlet,在这个Servlet中我们访问了Cookie并获取到Cookie的值
其实是因为我们没有关闭浏览器,所以在LoginServlet设置Cookie信息会有效,IndexServlet能支持访问到Cookie的信息,但一旦,我们关闭了浏览器,重新打开浏览器,直接访问IndexServlet时,会报错,Cookie失效了
但是这里的报错是空指针异常,就是没有cookie值,cookie数组是空的(因为所有的Cookie信息都失效了),会引发空指针异常
可以将上面的程序更改一下,增强健壮性
没有访问LoginServlet的情况下,访问IndexServlet,就会输出user not login
设置Cookie时效性
先访问LoginServlet,先让浏览器将cookie信息保存,让后面request请求中带有cookie信息
关闭浏览器:然后重新启动Tomcat服务,访问IndexServlet:结果是发现Cookie并没有因为关闭浏览器而失效,因为我们把其时效性设置为7天
注解
- cookie(大概率)也是浏览器自动创建的,浏览器会在本地创建一个存放所有Cookie对象的列表:然后我们也可以通过
Cookie cookie = new Cookie(“user”,”admin”); 自己创建一个cookie,然后通过response.addCookie(cookie); 响应返回浏览器,然后浏览器会把这个返回cookie添加到自己维护的cookie列表中; 然后通过Cookie[] cs = request.getCookies(); 获取所有cookie列表
- 换句话说,Cookie是浏览器创建和维护的;这是个特殊的Java对象,这些对象有很多属性和方法,我们可以按需调用