无状态HTTP的“记忆”方案核心逻辑
HTTP协议本质无状态,需借助Cookie和Session实现用户身份识别与状态保持。Spring Boot提供标准化方案,兼顾安全性与扩展性。
Cookie实现方案
浏览器端存储键值对,每次请求自动携带。Spring Boot中通过HttpServletResponse添加Cookie:
Cookie cookie = new Cookie("user_token", UUID.randomUUID().toString());
cookie.setMaxAge(7 * 24 * 60 * 60); // 7天有效期
cookie.setPath("/");
cookie.setHttpOnly(true); // 禁止JavaScript访问
response.addCookie(cookie);
读取时使用@CookieValue注解:
@GetMapping("/profile")
public String profile(@CookieValue(name = "user_token", defaultValue = "") String token) {
if(token.isEmpty()) return "redirect:/login";
return "profile_page";
}
Session服务端方案
基于Cookie的Session ID传递,数据存储在服务端内存或Redis。Spring Boot自动配置:
server:
servlet:
session:
timeout: 1800 # 30分钟超时
控制器直接操作Session:
@PostMapping("/login")
public String login(HttpServletRequest request, @RequestParam String username) {
HttpSession session = request.getSession();
session.setAttribute("username", username);
return "dashboard";
}
分布式场景需配置Redis存储:
@Bean
public RedisIndexedSessionRepository sessionRepository(RedisOperations<String, Object> redisOperations) {
return new RedisIndexedSessionRepository(redisOperations);
}
安全增强策略
- 强制HTTPS传输:
@Bean
WebSecurityCustomizer securityCustomizer() {
return (web) -> web.ignoring().requestMatchers("/error");
}
- CSRF防护配合Cookie:
spring.security.oauth2.client.registration.csrf.token-header=XSRF-TOKEN
- 定期更换Session ID:
http.sessionManagement(session -> session
.sessionFixation().changeSessionId()
);
性能优化技巧
- 使用
@SessionAttributes注解减少序列化开销 - 对于只读场景启用
session.setAttribute("key", Collections.unmodifiableMap(data)) - 高频访问数据改用
ConcurrentHashMap存储
常见问题解决方案
Cookie失效问题
检查域名和路径是否匹配,跨域需明确指定:
cookie.setDomain(".example.com");
Session并发冲突
采用乐观锁机制:
session.setAttribute("version", session.getAttribute("version") + 1);
集群环境同步
Redis配置发布订阅通道:
spring:
session:
redis:
flush-mode: on_save
namespace: spring:session

被折叠的 条评论
为什么被折叠?



