JavaEE:分布式session
一、使用Redis存储分布式session:
1.SpringBoot整合Redis,见如下地址:
JavaEE:SpringBoot整合Redis_a526001650a-CSDN博客
2.代码实现分布式session存储(此处以token为例):
@Autowired
private RedisTemplate<String, String> redisTemplate; //Redis数据操作类//登录接口,存储token到redis中
@PostMapping("/login")
public Response login(String phone, String code, HttpServletRequest request, HttpServletResponse response) {//...省略验证手机号/验证码逻辑//1.根据手机号从库中查出用户信息User user = ...;//2.生成tokenString token = jwtUtil.genToken(String userNo, String phone);user.setToken(token);//3.1.缓存token到redis中redisTemplate.opsForValue().set("USER_TOKEN" + ":" + user.getId(), token);//3.2.缓存用户信息到cookie中Cookie c = new Cookie("USER", gson.toJson(user));c.setMaxAge(时间); //设置最大有效期c.setDomain("yyh.com");c.setPath("/");response.addCookie(c);return Response.ok(user); //返回登录成功
}//退出登录接口,移除redis中的token
@PostMapping("/logout")
public Response logout(@RequestParam String userId, HttpServletRequest request, HttpServletResponse response) {//...省略获取/验证token逻辑//1.清除redis中的tokenredisTemplate.delete("USER_TOKEN" + ":" + userId);//2.清除cookie中tokenCookie c = new Cookie("USER", null);c.setDomain("yyh.com");c.setPath("/");c.setMaxAge(0); //设置过期时间为0(设为已过期)response.addCookie(c);return Response.ok(); //返回退出登录成功
}
二、使用Spring Session存储分布式session:
1.导入spring session与spring安全框架依赖:
<!-- 导入spring session -->
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId><version>3.5.1</version>
</dependency>
<!-- 导入spring安全框架 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId><version>3.5.3</version>
</dependency>
2.配置spring-session使用redis存储,在application.yml中:
spring:session: #配置spring-session使用redis存储store-type: redis
3.代码实现分布式session存储(此处以token为例):
(1)在Application中开启基于redis的httpsesion:
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class}) //免除spring-session存储key时要求登录
@EnableRedisHttpSession //开启基于redis的httpsesion
public class Application { //启动类public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
(2)使用spring-session存储分布式token:
//登录接口,保存token到SpringSession中
@PostMapping("/login")
public Response login(String phone, String code, HttpServletRequest request, HttpServletResponse response) {//...省略验证手机号/验证码逻辑//1.根据手机号查出用户信息User user = ...;//2.生成tokenString token = jwtUtil.genToken(String userNo, String phone);user.setToken(token);//3.保存token到SpringSession中HttpSession hs = request.getSession();hs.setAttribute("USER_TOKEN" + ":" + user.getId(), token);hs.setMaxInactiveInterval(30 * 24* 60 * 60); //超时时间//...省略缓存用户信息到cookie中return Response.ok(user); //返回登录成功
}//登出接口,移除SpringSession中token
@PostMapping("/logout")
public Response logout(@RequestParam String userId, HttpServletRequest request, HttpServletResponse response) {//...省略获取/验证token逻辑//1.清除Spring Session中的tokenHttpSession hs = request.getSession();hs.removeAttribute("USER_TOKEN" + ":" + userId); //删除指定用户token//...省略清除cookie中tokenreturn Response.ok(); //返回退出登录成功
}