


Session 的本质类似一个" 哈希表 “,存储了键值对结构,Key 就是SessionID,Value就是用户信息。上述例子所说的” 令牌 "就是可以看做SessionID,除了SessionID之外还可以存储一些其他信息,时间等等。


传统获取,示例:
@RestController
@RequestMapping("/request2")
public class Request2Controller {
@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if (cookies != null){
for (Cookie cookie : cookies){
System.out.println(cookie.getName() + ": " + cookie.getValue());
}
}
return "获取cookie成功";
}
}HttpServletRequest 和 HttpServletResponse 是Spring MVC 方法的内置对象,HttpServletRequest 对象表示客户端的请求,http 请求头中所有信息都封装在这个对象中,通过该对象的方法可以获得客户端请求的所有信息。 HttpServletResponse 对象代表服务器的响应,Http 响应的信息都封装在这个对象中,通过该对象的方法可以获得服务器响应的所有内容。 Spring MVC 对这两个对象基础上进行了封装,提供了更简单的方法。
此时没有Cookie,所以返回的为Null,通过手动设置Cookie,并在浏览器访问可以得到,在控制台输出。由此Cookie是可以伪造的,所以不安全,在使用Cookie时,要在后端进行Cookie检验。



简洁获取: 可以通过 @CookieValue 注解获取Cookie,示例:
@RestController
@RequestMapping("/request2")
public class Request2Controller {
@RequestMapping("/getCookie2")
public String getCookie(@CookieValue String name){
return "获取到cookie :" + name;
}
}通过浏览器访问:

Session 是服务器端的机制,需要先存储然后进行获取。Session 也是通过 HttpServletRequest 进行存储和获取。
@RestController
@RequestMapping("/request2")
public class Request2Controller {
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request,String name){
HttpSession session = request.getSession();
session.setAttribute("name",name);
session.setAttribute("age",18);
session.setAttribute("userInfo",new Person("zhangsan",17,1));
return "设置session成功";
}
}在浏览器中访问接口:会有一个SessionID创建。

@RestController
@RequestMapping("/request2")
public class Request2Controller {
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request){
//获取session
HttpSession session = request.getSession();
if(session != null){
System.out.println(session.getAttribute("name"));
System.out.println(session.getAttribute("age"));
System.out.println("userInfo" + session.getAttribute("userInfo"));
}
return "获取session成功,name: " + session.getAttribute("name");
}
}通过浏览器访问url:http://127.0.0.1:8080/request2/getSession

通过postman 访问:

简洁获取Session:通过@SessionAttribute 注解获取,示例:
@RestController
@RequestMapping("/request2")
public class Request2Controller {
@RequestMapping("/getSession2")
public String getSession2(@SessionAttribute String name){
return "获取session成功,name: " + name;
}
}但是如果参数较多的情况下,需要列出的参数也很多,因此可以使用下面的方式获取,介于第一种和第二种之间,更简洁且获取多个参数不需要将多个参数都列出。Session不存在的话会自动创建。
@RestController
@RequestMapping("/request2")
public class Request2Controller {
@RequestMapping("/getSession3")
public String getSession3(HttpSession session){
return "获取session成功,name: " + session.getAttribute("name");
}
}浏览器访问结果:

本次分享围绕 Spring Web MVC 中 Cookie 与 Session 展开:从基础概念明确了二者是 HTTP 无状态协议下实现状态管理的核心工具,再到差异对比理清了 “客户端存储” 与 “服务端存储” 的适用场景,最后通过实战示例掌握了具体的获取方式。