Session是什么
Session是服务器端用来存储特定用户会话数据的一种机制。由于HTTP是无状态的,Session通常会被用来跟踪用户的交互。比如在用户登录后,服务器会创建一个Session,通常使用一个唯一标识符(如JSESSIONID
)并通过Cookie返回给客户端。客户端在后续的请求中携带这个标识符,使得服务器能够识别并恢复用户会话。
Session的生命周期
创建:通常在用户成功登录时创建。
存储:Session数据可以存储在服务器内存、数据库或分布式缓存系统中。
失效:当浏览器关闭时,前端浏览器存储的Cookie会失效,导致Session与客户端的关联被断开,这时服务器端的Session数据可能并不会立即被物理删除。
销毁:用户登出时,服务器会显式地废弃Session,这通常涉及到删除Session数据或设置Session为无效。同样,当会话超时,服务器也会自动废弃Session。
如何设置Session属性
除了认证主体的principal
信息,还可以将其他与用户相关的信息存储在Session中,例如用户的角色、权限、个性化设置等。在Spring Security中,onAuthenticationSuccess
方法是一个典型的场景,用于设置Session属性,例如:
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
Object principal = authentication.getPrincipal();
if (principal instanceof UserDetails) {
String username = ((UserDetails) principal).getUsername();
HttpSession session = request.getSession();
session.setAttribute("username", username);
// 可以添加更多用户信息,如角色和权限
session.setAttribute("authorities", authentication.getAuthorities());
}
super.onAuthenticationSuccess(request, response, authentication);
}
其他典型场景包括:
- 用户注册后,将用户ID或其他注册信息存入Session。
- 购物车功能,将用户选择的商品信息存储在Session中。
- 用户设置页面,保存用户偏好设置。
如何获取Session属性:
在服务器端,你可以直接在控制器方法中使用HttpServletRequest
的getSession()
方法获取Session,并通过getAttribute()获取会话属性
。在前端,通常通过Ajax请求与后端交互,后端服务在处理这些请求时读取或更新Session数据。另一种方式是通过Web存储(Local Storage或Session Storage),但前提是要先通过api把session的内容读到Web存储中。
Session属性与Request属性的对比
Request属性仅存在于当前请求中,例如,处理搜索请求时设置搜索关键词。
@GetMapping("/search")
public String handleSearch(@RequestParam("keyword") String keyword, HttpServletRequest request) {
request.setAttribute("searchKeyword", keyword);
// 请求处理完成后,searchKeyword属性消失
return "searchResult";
}
Session属性在整个会话期间有效,适用于跨请求存储用户状态,如登录状态、购物车信息等。