现在一般使用比较多的认证方式有四种:
- Session
- Token
- SSO单点登录
- OAtuth登录
1.Cookie + Session
最常见的就是 Cookie + Session 认证。
Session,是一种有状态的会话管理机制,其目的就是为了解决HTTP无状态请求带来的问题。
当用户登录认证请求通过时,服务端会将用户的信息存储起来,并生成一个 SessionId 发送给前端,前端将这个 SessionId 保存起来。之后前端再发送请求时都携带 SessionId,服务器端再根据这个 SessionId 来检查该用户有没有登录过。这个 SessionId, 一般是保存在Cookie中。
如果用户第一次访问某个服务器时,服务器响应数据时会在响应头的 Set-Cookie 标识里将Session Id 返回给浏览器,浏览器就将标识中的数据存在Cookie中。
@RestController
@RequestMapping("/user")
public class UserController {@PostMapping("/login")public String login(@RequestBody User user, HttpSession session) {if ("admin".equals(user.getUsername()) && "admin".equals(user.getPassword())) {// 登录成功 写入Sessionsession.setAttribute("sessionId", user);return "login success";}return "username or password incorrect";}@GetMapping("/logout")public String logout(HttpSession session) {// 注销 删除Sessionsession.removeAttribute("sessionId");return "logout success";}@GetMapping("/api")public String api(HttpSession session) {// 用户操作 判断是否登录User user = (User) session.getAttribute("sessionId");if (user == null) {return "please login";}return "return data";}
}
切记:用户名存在session里面时只能使用session.setAttribute("sessionId", user);
- 在第一次访问服务器时,服务器会生成一个唯一的session id,并将该id发送给客户端。客户端在后续的请求中会将该session id作为cookie或者请求参数的形式发送回服务器。
- 服务器接收到session id后,会根据该id在服务器端的session存储区中查找对应的session对象。该session对象用于存储用户