是什么:
Cookie: 是浏览器端的客户数据容器。
Session:是服务器端的客户数据容器。
演示怎么用和原理:( Spring boot 框架的基础上演示)
Cookie Demo
@RestController
@RequestMapping("hello")
public class helloCookie {
@RequestMapping("getData")
public String getData(HttpServletResponse response, HttpServletRequest request) throws IOException {
//客户端浏览器会根据服务器地址(例如:www.baidu.com),来查询本地保存的cookie 并发送给服务器端(例如:百度服务器),服务器会封装到request 中,然后通过request.getCookies()就可以获取到 cookie数据 。
Cookie[] cookies = request.getCookies();
for(Cookie c : cookies){
if(c.getName().equals("lastTime")){
return "you last Time:"+c.getValue();
}
}
//自己创建一个cookie.c
// Cookie c= new Cookie("lastTime",System.currentTimeMillis()+"");
Cookie c = new Cookie("lastTime","hello");
c.setMaxAge(10);//设置10秒失效, 设置为0 就会立即失效,如果不设置,cookie会生存到本次浏览器关闭(注意是浏览器关闭,不是关闭这个网站的标签)
//设置浏览器在访问hello项目时,发送该cookie,否则访问 服务器时,都会带上这个cookie.
c.setPath("/hello");
response.addCookie(c);
return "It's you first time to be here.";
}
}
PS: 注意不同的浏览器(IE,chrome,firefox… 的cookie不共享),有自己储存cookie的地方。所以不同的浏览器,有自己各自的cookie.
Session Demo
/**
* session是服务器端,为每个客户端创建的独立的数据容器。
* 通过 request.getSession()获取 session.
* getSession()方法内部会去 request 请求里的cookie 和 url 中查找 jsessionid.
* 如果找到就去内存中查找对于的客户端session容器,如果没有,为当前客户端,创建一个session.
* 如果cookie 被禁用,那么可以通过url 来传递,但是局限很大,具体看下面代码。
*
* session 默认有效时长是 30分钟,如果30分钟内内操作,服务器端会默认销毁掉
*/
@RestController
@RequestMapping("session")
public class helloSession {
@RequestMapping("buy")
public String buy(HttpServletResponse response, HttpServletRequest request){
//服务器通过客户端回传的 jsessionid 获取,对应客户端的session.
//如果当期没获取到jsessionid就会自己创建一个。
HttpSession session = request.getSession();
session.setMaxInactiveInterval(30*60);// 是当前session的失效时间,单位秒。如果设置的值为零或负数,则表示会话将永远不会超时。
return "你买了一台"+session.getAttribute("shop");
}
@RequestMapping("add")
public String add(HttpServletResponse response, HttpServletRequest request){
//如果当期没获取到jsessionid就会自己创建一个。
HttpSession session = request.getSession();
session.setAttribute("shop","电脑");
return "购买成功";
}
@RequestMapping("home")
public String home(HttpServletResponse response, HttpServletRequest request){
StringBuilder sb = new StringBuilder();
//cookie 被禁用后自己通过url 传递 sessionid,
//局限问题:同一个用户,自己打开多个浏览器中传递sessionid,除非自己手动copy URL.
//不同于Cookie ,cookie是保存在本地的,多个窗口访问同一个 地址(www.baidu.com),回去本地去读,cookie值,cookie 保存了jsessionid
//同样也要注意,每个浏览器厂商保存cookie的位置和方式不同,不容浏览器也不能通过cookie 获取 sessionid.
String jsessionid = request.getSession().getId();
//注意连接后面试';'不是问号。
sb.append("<a href='/session/add;jsessionid="+jsessionid+"'>购买</a><br>");
sb.append("<a href='/session/buy;jsessionid="+jsessionid+"'>结账</a>");
return sb.toString();
}
}