昨天面试官问我,在网页登陆之后,为什么在其他页面也是保持登陆状态的呢。当时我一脸懵逼,只好支支吾吾的说大概是保存在session或者cookie里了。然后他就开始问细节,显然我并不了解。因此决定现在好好来理解一下session和cookie到底是怎么回事。
0. 会话
用户打开一个浏览器,访问web资源,就产生了一个会话。当用户关闭浏览器,会话结束。
学术地讲,他是指一个终端用户与交互系统进行通讯的过程。他的生命期是从建立TCP连接起,到释放TCP连接止。
1. cookie是什么?
由于http协议是无状态的,因此仅靠协议本身,是无法实现“记住登陆状态”这种功能的。处于这种需求,cookie应运而生。
cookie就是储存在用户本地终端上的数据。
2. Java中的Cookie
来源于javax.servlet.http.Cookie。以下说明几种方法:
Cookie(String name, String value)。 Cookie的构造方法。
public void setMaxAge(int expiry)。 MaxAge是Cookie的存活时间,单位秒。该方法可以设置Cookie的有效期。如果有效期为零,也就是浏览器关闭时即销毁Cookie,这种Cookie也被称为会话Cookie;如果设置了Cookie的有效期,比如一天,那么Cookie就会被保存到硬盘中,存活时间为一天,这种Cookie也被称为持久Cookie。
public void setPath(String uri)。设置cookie的有效路径,比如把cookie的有效路径设置为"/hello",那么访问"hello"目录下的web资源时,都会带上cookie。
public void setDomain(String pattern)。设置cookie的有效域。
3. 一个实例
来源 https://www.cnblogs.com/xdp-gacl/p/3803033.html
public class CookieDemo1 extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
Cookie[] cookies = request.getCookies();
if (cookies!=null) {
out.write("The last access time is: ");
for (int i=0; i<cookies.length; ++i)
{
if (cookies[i].getName().equals("lastAccess"));
{
Long lastAccess = Long.parseLong(cookies[i].getValue());
Date date = new Date(lastAccess);
out.write(date.toLocaleString());
}
}
}
else {
out.write("It's the first time you access.");
}
Cookie c = new Cookie("lastAccess", System.currentTimeMillis()+"");
response.addCookie(c);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
doGet(request, response);
}
}
打开浏览器时会显示第一次访问,之后刷新都会显示最后一次访问的时间。如果关掉浏览器再打开就会显示第一次访问。
如果加上这句:
c.setMaxAge(10*60);
那么就生成了持久cookie,存放在硬盘中。那么在有效期内,关闭浏览器再打开依然会显示上一次访问时间。