Cookie和Session是在HTTP协议中常用的令牌,两者很容易混淆,需要进行区分。
目录>>
1. 为什么需要Cookie和Session?
HTTP协议自身是属于"无状态"协议,默认情况下,HTTP协议的客户端和服务器之间的这次通信,和下次通信之间没有直接的联系,就像服务器没有记忆一样。实际上,无状态协议比有状态协议更优,无状态协议设计简化了服务器设计,有状态的协议设计使得服务器的设计非常复杂和繁重。 无状态协议在崩溃时工作得更好,因为没有必须恢复的状态,发生故障的服务器可以在崩溃后简单地重新启动。
但是实际开发中,我们很多时候是需要知道请求之间的关联关系的,例如,登陆网站成功后,第二次访问的时候服务器就能知道该请求是否是已经登陆过了。
那么,我们如何实现呢?就需要依靠 Cookie & Session。
2. Cookie是什么?
Cookie实际上是浏览器保存用户信息的地方。在浏览器需要记录"令牌"(Cookie)信息,以及令牌对应的用户信息,这个就是Session机制所做的工作。
就像进校门,学生需要用学生证(Cookie)验证信息,学生证由学生来保存,学生发出验证请求,校门如何知道该学生是否是本校学生,就依靠学生证上的信息与学校信息库对照,如果验证成功,则发出开门响应。
3. Session是什么?
Session实际上是服务器保存用户信息的地方。
在计算机领域,会话是一个客户与服务器之间的不中断的请求响应。对客户的每个请求,服务器能够识别出请求来自于同一个客户。当一个未知的客户向Web应用程序发送第一个请求时,就开始了一个会话。当客户明确结束会话或服务器在一个时限内没有接受到客户的任何请求时,会话就结束了。
比如在我们在网购私聊商家时,专属服务的客服。
服务器同一时刻收到的请求是很多的,服务器需要清楚的区分每个请求是从属于哪个用户,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系。
Session是服务器为了保存用户信息而创建的一个特殊的对象。
4. Cookie和Session的区别。
1) Cookie是客户端保存用户信息的一种机制,Session是服务器端保存用户信息的一种机制;
2) Cookie和Session之间主要是通过 Sessionld 关联起来的, Sessionld是Cookie和Session之间的桥梁;
3) Cookie和Session经常会在一起配合使用,但是不是必须配合;
完全可以用Cookie来保存一些数据在客户端,这些数据不一定是用户身份信息,也不一定是Sessionld。Session 中的SesionId也不需要非得通过Cookie/Set-Cookie传递,比如通过URL传递。
5. 如何获取Cookie?
(1)传统获取Cookie:
获取所有Cookie。
@RequestMapping("/getC")
public String getCookie(HttpServletRequest request, HttpServletResponse response){
// HttpServletRequest和HttpServletResponse是内置对象,需要才加
// 获取参数
// String name = request.getParameter("name");
Cookie[] cookies =request.getCookies();
if (cookies!=null){
Arrays.stream(cookies).forEach(ck -> System.out.printf(ck.getName()+":"+ck.getValue()));
}
return "获取cookies";
// 获取所有Cookie
}
(2)简洁获取Cookie:
获取某一Cookie。
@RequestMapping("/getC2")
public String getCookie2(@CookieValue("Charlie") String Charlie){
// 获取某一Cookie
// String name = request.getParameter("name");
return "从某一cookie中获取值" + Charlie;
}
6. 如何获取Session?
(1)传统获取Cookie:
从cookie中获取到sessionID,根据session获取Session对象:
从cookie中获取到sessionID,根据session获取Session对象,如果没有获取到,则会创建一个session对象。
@RequestMapping("/setSess")
public String setSess(HttpServletRequest request){
// 从cookie中获取到sessionID,根据session获取Session对象,如果没有获取到,则会创建一个session对象
HttpSession session = request.getSession();
session.setAttribute("name","Charlie");
return "设置Session成功";
}
@RequestMapping("/getSess")
public String getSess(HttpServletRequest request){
// 从cookie中获取到sessionID,根据session获取Session对象
HttpSession session = request.getSession();
String name = (String) session.getAttribute("name");
return "从session获取name"+name;
}
(2)简洁获取 Session:
对以上代码进行一些封装。
@RequestMapping("/getSess2")
public String getSess2(HttpSession session){
String name = (String)session.getAttribute("name");
return "从session中获取name:"+name;
}
spring进行封装,引入注解。
// spring进行封装,引入注解
@RequestMapping("/getSess3")
public String getSess3(@SessionAttribute("name") String name){
// String name = (String)session.getAttribute("name");
return "从session中获取name:"+name;
}