1、cookie的作用
我们在浏览器中登录某个网站,比如你在登录一些网站的时候,你会发现你输入密码的时候,发现有记住密码的这个选项,当你在下次登录的时候,你会发现自己的账号已经自动登录了,但有的时候时间久了,你会发现又要让我们重新登录一边,那他的信息是怎么记录的呢。这里就用到了cookie的技术。我们为什么要用到cookie呢,因为HTTP协议是无状态的协议,当客户端与服务端数据交互完成时,链接就会关闭,每次交互数据都需要建立新的链接。有的时候这是很麻烦的,所以cookie就来帮我们解决这些问题。cookie由HTTP服务器设置,保存到我们的浏览器中。这样我们就不必每次访问一个链接时,都要输入密码了,但是cookie是有时间限制的超出设定的时间,就会被清除。
2、保存会话数据的两种技术.
什么是会话?会话可以简单的理解为:用户开一个浏览器,点击多个链接,访问服务器的多个web资源,然后关闭浏览器,整个过程称之为一次会话。
2.1 cookie
cookie是一种客户端的技术,程序把每个用户的数据以cookie的形式写给各自的浏览器。当用户使用浏览器再去访问服务器的web资源时,就会带着各自的数据去。(例如,我们的账号与密码),这样web资源处理的就是用户各自的数据了。(你的浏览器密码,不会被别人的浏览器使用)
2.2session
session服务端的技术,利用这个技术,服务器在运行时可以为每一个用户创建一个其独有的session对象,这样用户可以把自己的数据存储到自己的session对象中,当用户再去访问该服务器的其它web资源时,其它web资源就可以从用户的独有的session取出必要的数据来为用户服务。
3、Java中提供的操作cookie的API
Cookie(java.lang.String name,java.lang.String value) | 构造函数 | 创建一个cookie的对像,并传入cookie的名称,和cookie的值 |
getName() | java.lang.String | 返回cookie的名称 |
getValue() | java.lang.String | 返回cookie的值 |
getVersion() | int | 返回此cookie遵守的协议版本 |
setMaxAge(int expiry) | void | 设置cookie的最大保存时间,如果服务端没有设置的话,那么这个cookie仅在一次会话有效。当浏览器关闭的时候,就失效了。假如我们设置了30分钟,那么该cookie会在我们的硬盘上保存30分钟,30分钟之后,就会失效。 为什么可以做到呢? 因为我们的浏览器就是一个软件,服务器回送的数据存储在浏览器的缓存中,当浏览器关闭时,如果没有设置时间的话,那么缓存会被清理,所以cokie就失效了。 |
getMaxAge() | int | 返回该cookie的保存时间 |
setPath(String uri) | void | 设置cookie的有效路径,(有效路径?假如我i们设置的有效路径为/luther那么当浏览器访问/luther下的web资源时,才会带上cookie一起访问) |
getPath() | String | 返回有效路径 |
setDomain(String pattern) | void | 设置cookie有效域,参数必须以.开始 |
getDomain() | void | 获取cookie的有效域 |
tips:关于有效域和有效路径,可以参考这篇文章https://blog.csdn.net/wang379275614/article/details/53333054
4、cookie的使用范例:
4.1 cookie记录上一次访问的时间
package com.luther.TestWeb;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
public class TestCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out=resp.getWriter();
Cookie cookies[]=req.getCookies();
for(Cookie c:cookies){
System.out.println(c.getName());
}
if(cookies!=null){
for(int i=0;i<cookies.length;i++){
Cookie cook=cookies[i];
if(cook.getName().equalsIgnoreCase("lastAccessTime")){
Long time=Long.parseLong(cook.getValue());
Date date=new Date(time);//生成日期对象
out.println("你上一次最后来的时间是:"+date.toLocaleString());//日期格式
}
}
} else{
out.write("这是你第一次来");
}
Cookie cookie1=new Cookie("lastAccessTime",System.currentTimeMillis()+"");
resp.addCookie(cookie1);
out.flush();
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
上面的没有设置cookie的有效期,所以当我们关闭浏览器的时候,cookie就会被清理.
Cookie cookie1=new Cookie("lastAccessTime",System.currentTimeMillis()+"");
//一天,秒为单位
cookie1.setMaxAge(24*60*60);
resp.addCookie(cookie1);
tips:cookie的注意细节:
一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。(上面的for each可以看出来)
一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
4.2删除cookie
package com.luther.TestWeb;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/recookie")
public class RemoveCookie extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//创建一个名称为lastAcessTime的cookie
Cookie cookie=new Cookie("lastAcess",System.currentTimeMillis()+"");
//删除该cookie
cookie.setMaxAge(0);
Cookie[] cookies = req.getCookies();
resp.addCookie(cookie);
}
}
4.3 cookie中存取中文.
如果要在cookie中存取中文的话,那么必须使用URLEncoder类里的encode(String name,String codingFormat)来对中文进行编码。
Cookie cookie=new Cookie("country", URLEncoder.encode("中国","utf-8"));
同样我们如果需要在cookie中读取中文的话,那么需要用对应的码表来进行解码,使用URLDecoder类中的decode(String value,String codingFormat);来进行解码。
out.write(cookie2.getName()+" ..."+URLDecoder.decode( cookie2.getValue(),"utf-8"));
5、cookie的一些注意点
--服务器可以向客户端写内容,只能是文本内容。(不能写其他的文件,否则会不安全)
--客户端可以阻止服务器端写入。
--服务器端只能拿自己webapp写入的的东西。(不可跨域名google只能拿google的东西)
--cookie就是服务器端写入客户端的这些个小文本的信息。Cookie以“键-值”对的形式保存数据。
--登陆后(设置的时间)不用再登陆。就是服务器把信息保存在了客户端的cookie里面了。