在登录某个网站时,比如登录163邮箱的网站,界面中有个十天免登陆的选项,先不勾选该选项,登录成功之后关闭浏览器或重启电脑,当再次访问163邮箱时会提示用户登录,这说明http协议是无状态的,在不同的请求之间是无法进行数据传递的。
而当勾选了十天免登陆的选项并登录成功之后,关闭浏览器或者重启电脑,之后再次访问163邮箱时就会自动登录了。这说明用户登录的一些信息保存到了该电脑的硬盘中(默认会存在浏览器的缓存中,可以设置保存在硬盘上),当访问163邮箱网站时,浏览器会将这些数据发送到服务器,从而实现了自动登录的功能,客户端电脑中用于保存这数据的资源,称为cookie。
用户在勾选十天免登陆的选项并登录成功之后,由服务器生成 Cookie,并将其封装到响应头中,以响应的形式发送给浏览器。浏览器接收到这个响应后,将 Cookie 保存到硬盘中。当浏览器再次发送同类请求后,在请求中会携带保存在硬盘的Cookie数据,发送到服务端,由服务器对解析该Cookie。
Cookie 技术并不是 JavaWeb 开发专属技术,而是属于 Web 开发的技术,是所有 Web 开发语言均支持的技术。Cookie 是由若干键值对构成,这里的键一般称为 name,值称为 value。 Cookie 中的键值对均为字符串。
总的来说cookie的作用就是在客户端存储一些数据,当浏览器再次请求某个服务器时会携带这些数据从而提供更好的用户体验。
删除cookie
通过火狐浏览器可以查看cookie,点击浏览器右上角的三个横杠–>选项–>隐私–>移除单个cookie,在这个界面中可以删除单个cookie也可以删除全部cookie,删除后,再次登录163网站时会提示输入用户名和密码。在其他浏览器中点击清空浏览器数据之后,也可以删除cookie。
注意:不同的web服务器在客户端所生成的cookie之间是不能相互访问和共享的。
cookie的禁用
浏览器是可以禁用 Cookie 的,即浏览器不接收服务器发送来的 Cookie。现在的很多网站,若浏览器禁用了 Cookie,则将无法访问。火狐浏览器中对于 Cookie 的禁用,是在火狐浏览器的“打开菜单/选项”的“隐私”标签中。不勾选“接受来自站点的 Cookie”,则表示禁用 Cookie。下面代码可以检测出浏览器是否禁用cookie:
1 if(navigator.cookieEnabled == true){ 2 alert("支持cookie"); 3 }else{ 4 alert("cookie已被禁用"); 5 }
cookie小知识
在javax.servlet.http包下有个名为Cookie的类,通过该类就可以向客户端设置cookie数据了。
cookie的默认绑定路径
创建一个servlet:
1 /** 2 * Cookie的默认绑定路径 3 * 4 */ 5 public class CookieTest01 extends HttpServlet { 6 private static final long serialVersionUID = 1L; 7 8 9 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 10 //创建cookie,第一个参数类似map的key,第二个参数类似map的value,不能存中文 11 Cookie cookie1 = new Cookie("username","monkey1024"); 12 Cookie cookie2 = new Cookie("password","123456"); 13 14 //将Cookie添加到相应中 15 response.addCookie(cookie1); 16 response.addCookie(cookie2); 17 } 18 19 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 20 doGet(request, response); 21 } 22 23 }
在web.xml中将上面的servlet的url-pattern设置为:/test/cookie01
访问该servlet时,可以通过fiddler中看到响应头中携带了之前设置的cookie信息。此时两个cookie与默认资源路径http://localhost:8080/07-03-cs/test 进行了绑定,也就是url-pattern中的上一级路径,当再次访问路径包含以上资源路径的url时,会自动将cookie放到请求头中向服务器发出请求。
设置绑定路径
cookie除了默认绑定之外我们还可以手动设置其绑定路径:
1 /** 2 * Cookie的手动绑定路径 3 * 4 */ 5 public class CookieTest02 extends HttpServlet { 6 private static final long serialVersionUID = 1L; 7 8 9 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 10 //创建cookie 11 Cookie cookie1 = new Cookie("username","monkey1024"); 12 Cookie cookie2 = new Cookie("password","123456"); 13 14 //手动设置绑定路径 15 cookie1.setPath(request.getContextPath() + "/aaa"); 16 cookie2.setPath(request.getContextPath() + "/aaa"); 17 18 //将Cookie添加到相应中 19 response.addCookie(cookie1); 20 response.addCookie(cookie2); 21 } 22 23 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 24 doGet(request, response); 25 } 26 27 }
设置cookie的有效时长
默认情况下, Cookie 是保存在浏览器的缓存中的,关闭浏览器后Cookie也就消失了。
开发者可以通过设置Cookie的有效时长,将Cookie写入到客户端硬盘文件中。
可以通过下面的方法设置有效时长
public void setMaxAge(int expiry)
其中expiry的单位为秒,整型。
1 /** 2 * Cookie的失效时间 3 * 4 */ 5 public class CookieTest03 extends HttpServlet { 6 private static final long serialVersionUID = 1L; 7 8 9 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 10 //创建cookie 11 Cookie cookie1 = new Cookie("username","monkey1024"); 12 Cookie cookie2 = new Cookie("password","123456"); 13 14 //手动设置绑定路径 15 cookie1.setPath(request.getContextPath() + "/aaa"); 16 cookie2.setPath(request.getContextPath() + "/aaa"); 17 18 //设置cookie的失效时间 19 cookie1.setMaxAge(60 * 60);//一小时 20 cookie2.setMaxAge(60 * 60 * 24);//一天 21 22 //将Cookie添加到相应中 23 response.addCookie(cookie1); 24 response.addCookie(cookie2); 25 } 26 27 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 28 doGet(request, response); 29 } 30 31 }
服务器端获取请求的cookie
在 HttpServletRequest 中有一个方法getCookies(),专门用于读取请求中所携带的 Cookie 数据,该方法的返回值类型是Cookie数组。
1 /** 2 * 接收客户端请求中携带的Cookie 3 * 4 */ 5 public class CookieReceive extends HttpServlet { 6 private static final long serialVersionUID = 1L; 7 8 9 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 10 Cookie[] cookie = request.getCookies(); 11 for(Cookie c : cookie){ 12 System.out.println("name="+c.getName()); 13 System.out.println("value="+c.getValue()); 14 } 15 } 16 17 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 doGet(request, response); 19 } 20 21 }
练习
1.实现获取用户上一次访问时间的功能,即当用户访问服务器,如果是非第一次访问的话,需要将上一次访问服务器的时间给用户显示出来。
1 /** 2 * 获取用户的最后访问时间 3 * 4 */ 5 public class LastVisitTime extends HttpServlet { 6 private static final long serialVersionUID = 1L; 7 8 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 9 response.setContentType("text/html;charset=UTF-8"); 10 PrintWriter out = response.getWriter(); 11 //获取客户端的所有Cookie对象 12 Cookie[] cookies = request.getCookies(); 13 /* 14 //如果等于null则说明是第一次访问 15 for (int i = 0;cookies!=null && i < cookies.length; i++) { 16 if("lastVisitTime".equals(cookies[i].getName())){//找到name为lastVisitTime的cookie 17 long l = Long.parseLong(cookies[i].getValue());//把Cookie中的value取出 18 out.write("你的最后访问时间为:"+new Date(l).toLocaleString());//yyyy-MM-dd 19 } 20 } 21 22 //创建cookie, 23 Cookie cookie = new Cookie("lastVisitTime",System.currentTimeMillis()+""); 24 */ 25 // 如果等于null则说明是第一次访问 26 if (cookies == null) { 27 out.write("第一次访问"); 28 } else { 29 for (int i = 0; i < cookies.length; i++) { 30 if ("lastVisit".equals(cookies[i].getName())) {// 找到name为lastVisitTime的cookie 31 out.write("你的最后访问时间为:" + cookies[i].getValue()); 32 } 33 } 34 } 35 36 //使用jdk8中的LocalDateTime 37 LocalDateTime currentTime = LocalDateTime.now(); 38 //不能有空格 39 //DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 40 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd/HH:mm:ss"); 41 // 创建cookie 42 Cookie cookie = new Cookie("lastVisit", currentTime.format(formatter)); 43 //设置cookie的有效时间,单位是秒 44 cookie.setMaxAge(60*60);//保存时间为1小时 45 //把cookie信息写回到客户端 46 response.addCookie(cookie); 47 48 } 49 50 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 51 doGet(request, response); 52 }
2.实现十天内免登陆的功能,当用户成功登陆后,十天内可以自动登录。用户名和密码直接写在代码中即可。
原文:https://www.cnblogs.com/samuraihuang/p/10753957.html