这是我参与更文挑战的第27天,活动详情查看: 更文挑战
http:无状态协议,不能保存登陆状态
cookie是对http协议的扩展,服务端在响应头添加Set-Cookie 字段,将cookie值发送给客户端,浏览器在收到这个响应时,会自动将cookie保存起来,下次再发送请求时,会将这个cookie附带在请求头的Cookie字段中发给服务器。
1.cookie是按照域名分别存储的,从A域名得到的cookie只会发送回A域名。
2.cookie分为临时cookie和长久cookie。如果一个cookie没有设置有效期,那么浏览器在关闭时就会删除这个cookie,这种cookie叫做临时cookie,如果cookie设置了有效期,那么浏览器会一直保存这个cookie,直到有效期为止,这种cookie叫做长久cookie。 cookie常用于存储用户的登录信息。
Session 是对服务端来说的, 客户端没有Session这一说. session生命周期一次会话 客户端请求服务端,服务端(Tomcat)会为这次请求开辟一块内存空间,这个对象便是Session对象, 存储结构为ConcurrentHashMap。 session的目的:弥补HTTP无状态特性,服务器可以利用session存储客户端在同一个会话期间的一些操作记录。
服务器、客户端如何获取sessionID?SessionID在期间是如何传输的?
服务器第一次接收请求,创建session对象,生成sessionid,并通过响应头设置 set-cookie,“JSESSIONID=XXXXXXX”命令,向客户端发送要求设置cookie的响应; 客户端收到响应后,在本机客户端设置了一个JSESSIONID=XXXXXXX的cookie信息,该cookie的过期时间为浏览器会话结束;
@RestController
public class SessionDemo{
//首先,想要获取Cookie信息,那么就得先有Cookie信息,这边我们自己从头开始,先弄个Cookie吧。
@RequestMapping(value = "/cookies",method = RequestMethod.GET)
public void setCookies(HttpServletRequest request, HttpServletResponse response) throws IOException {
HttpSession session = request.getSession();
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
String id = session.getId();
if (session.isNew()){
response.getWriter().print("session创建成功,id:"+id);
}else {
response.getWriter().print("服务器已经存在session,session的id是:"+id);
}
}
}
关闭浏览器,session是否还存在? 存在,session的默认时间是20分钟。 cookie由于是存在进程中的,浏览器关闭后,cookie失效,JSESSIONID 也没了,再次访问时相当于创建一个新的sessio和JSESSIONID ,原session仍存在。
持久化Jsessionid,可以创建一个cookie为jessionid,设置有效时间
String id = session.getId();
// 手动创建一个存储JSESSIONID的Cookie,为该cookie设置持久化时间
Cookie cookie = new Cookie("JSESSIONID", id);
cookie.setMaxAge(10 * 60);
response.addCookie(cookie);