会话发展史
彻底理解cookie,session,token - 老刘的文章 - 知乎 https://zhuanlan.zhihu.com/p/63061864
为什么需要状态管理?
Web应用程序使用的是Http协议,该协议是"无状态"协议,即同一用户发了两次请求,建立了两次连接,但是服务器无法判断这两个请求是否是同一个人发出的,而我们的应用程序有时是需要判断是否为同一个客户发出的请求,比如客户多次选购商品,因此,有必要跟踪同一客户发出的一系列请求.
状态管理的两种常见模式
客户端状态管理技术:将状态保存在客户端,代表性的是Cookie技术.
服务器端状态管理技术:将状态保存在服务器端,代表性的是Session技术.
Cookie
浏览器向服务器发请求,服务器会将少量的数据以set-Cookie消息头的方式发送给浏览器,浏览器将这些数据保存起来,当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给浏览器.
Cookie用法
直接看代码吧,注释表明用法
public class CookieServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建Cookie
Cookie cookie =new Cookie("name", "zjc");
//添加Cookie到response中
response.addCookie(cookie);
//读取Cookie
Cookie[] cookies=request.getCookies();
if(cookies!=null){
for (Cookie ck : cookies) {
if(ck.getName().equals("name")){
System.out.println(ck.getValue());
}
}
}else{
System.out.println("没有Cookie信息");
}
//修改Cookie
if(cookies!=null){
for (Cookie ck : cookies) {
if(ck.getName().equals("name")){
//覆盖原来的value(zjc)
ck.setValue("xiaocheng");
//添加Cookie到response中
response.addCookie(ck);
}
}
}
//设置Cookie保存时间,单位为秒
//seconds > 0:保存在硬盘上的时间
//seconds = 0:立即删除
//seconds <0 :默认,保存在浏览器的内存中
cookie.setMaxAge(10);
//Cookie中文编码
Cookie cookie2 =new Cookie("mingzi", URLEncoder.encode("张金程","UTF-8"));
response.addCookie(cookie2);
if(cookies!=null){
for (Cookie ck : cookies) {
if(ck.getName().equals("mingzi")){
//解码
System.out.println(URLDecoder.decode(ck.getValue(), "UTF-8"));
}
}
}
}
}
Session
浏览器访问服务器时,服务器会为每一个浏览器在服务器端的内存中创建一个Session对象,这个对象有个SessionId的属性,其值唯一,并以Cookie的方式发给浏览器,下次浏览器再访问服务器时,服务器就可以拿到这个SessionId,并根据这个SessionId找到Session对象.(这些过程都是服务器做的)
Session用法
直接看代码吧,注释表明用法
public class SessionServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得Session对象
HttpSession session=request.getSession();
//绑定数据
session.setAttribute("name", "zjc");
//获得数据
String name=(String)session.getAttribute("name");
//移除数据
session.removeAttribute("name");
//删除Session对象
session.invalidate();
//修改Session对象的超时时间(一般是30分钟),时间过了就删除Session对象,单位为秒
session.setMaxInactiveInterval(600);
}
}