今天讲讲Cookie,Cookie太常见了,你就去超市去找,我最喜欢吃的就是趣多多,没办法,穷啊。。。
啊,不好意思,今天讲Cookie。
Cookie简介
Cookie的常用场景是什么呢?我一说你就明白了。我们在各大网站登录的时候,有的时候下面会有记住我,十天内等等选项啥的;Cookie就是干这个用的,如果你有什么刻骨铭心的想要记住的人,我建议你把TA放到Cookie里。但是你必须要设置一个期限,比如一万年,不然你可能7s后就忘了。
好了,前面开了个玩笑。接下来就正经的讲讲Cookie是什么吧。
Cookie实际上是一小段文本信息。客户端请求服务器,如果服务器需要记录用户的状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie存起来。当浏览器再次请求服务器时,浏览器会把请求的网址连同Cookie一同发送给服务器。服务器检查这个Cookie,确认用户的状态;服务器还可以根据需要修改Cookie,比如修改Cookie的有效期。
这里一般会有一个横向对比,那我也就不免俗了,我们对比一下Cookie和Session。
通过前面的介绍我们知道Cookie是存在客户端,由浏览器保管的;而Session呢,则是保存在服务器上的。如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
Session对象是在客户端第一次请求服务器的时候创建的;Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session;各客户的Session也彼此独立,互不可见。Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。
同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。
总结下来:cookie由后端创建,保存在客户端本地调用;session由服务器端自动生成,不需后端创建,保存在服务端。cookie最常见的场景是自动登录;session常见的场景就是会话追踪。
当然这么干说就比较生硬了,那我们简单的看一个例子,来生动的理解一下Cookie。
代码
我们先看这个小项目的结构图
这里面spring-web.xml和web.xml内容就是正常的普通配置,详细内容可以看GitHub里面的代码。
这里就直接看最主要的Controller。
首先我们在login()方法中设置了Cookie,我们看一下如何设置:
@RequestMapping(value = "/login", method = RequestMethod.POST)
public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{
String username = request.getParameter("user");
String password = request.getParameter("password");
if(username != "" && password != ""){
Cookie cookie = new Cookie("user",username + "," + password);
cookie.setMaxAge(60);
cookie.setPath("/");
response.addCookie(cookie);
response.sendRedirect("/check");
}else {
response.sendRedirect("/fail");
}
}
这里做了最简化,所以直接在判断用户名和密码不为空就直接存入缓存了;正常情况下,我们一般会验证该用户在数据库中是否存在,并且帐密都正确,登陆成功之后才设置Cookie。
使用Cookie cookie = new Cookie("user",username + "," + password);
新建了一个名为”user”的Cookie,这个方便我们以后查询Cookie的时候去查找,因为Cookie是以map的形式保存的。
这里又通过cookie.setMaxAge(60);
设置了Cookie的最大存活时间;cookie.setPath("/");
设置了Cookie的使用权限,具体可以参考这篇文章。最后通过response.addCookie(cookie);
把Cookie加入到response中,服务器就通过response把Cookie发送给浏览器,浏览器一存就ok了。
接着我们设置Cookie后,我们需要使用Cookie啊,所以另一个方法对Cookie中的参数进行了校验。
@RequestMapping(value = "/check", method = RequestMethod.GET)
public void check(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{
Cookie[] cookies = request.getCookies();
for(int i=0; i<cookies.length; i ++){
if(cookies[i].getName().equals("user")){
String value = cookies[i].getValue();
String[] elements = value.split(",");
String username = elements[0];
String password = elements[1];
if(username.equals("admin")&&password.equals("key")){
response.sendRedirect("/success");
}else {
response.sendRedirect("/fail");
}
}
}
}
浅显易懂,我就不解释了。只说一句,我们在获取Cookie的时候,需要通过request.getCookies()
获取一个Cookie列表,然后再遍历得到我们想要的Cookie。为什么呢?因为我们之前说过了,Cookie是由浏览器保存的,所以当你获取Cookie的时候,你得到的是这个浏览器的所有Cookie。
接下来我们看看成果。
当我们最开始进入首页的时候,是没有Cookie存在的。
接着我输入了一个错误的帐密,也生成了Cookie,这是因为再login()方法里面逻辑不够严谨导致的。
然后我输入了正确的帐密,Cookie的内容也发生了改变。
由于我设置了最大Cookie的存活时间为1分钟,所以过了一会我再次刷新页面,就会发现Cookie已经不见了。
我相信你已经注意到图片中的那个提示栏了,浏览器问你是否保存/更新保存的密码,其实就是浏览器更新自己的Cookie。所以想想平时登陆网站是不是点了这个提示栏中的“是”以后,再进入相关网站,需要登陆的时候,你会发现你的帐密已经输好了。这就是Cookie的妙用!