SpringBoot项目使用Spring Session,将Session保存在Redis中。
我们之前实现Java的会话管理功能,主要是使用Cookie或Session。Cookie是客户端技术,服务器把数据以cookie的形式保存在用户的浏览器中Session是服务器端技术,服务器把数据以session的形式保存在服务器中在分布式情况下,session会失效,比如项目部署在多台服务器中,服务器之间无法共享session,用户在A服务器上已经登录了,但当负载均衡跳转到服务器B时,由于B服务
我们之前实现Java的会话管理功能,主要是使用Cookie或Session。
-
Cookie是客户端技术,服务器把数据以cookie的形式保存在用户的浏览器中
-
Session是服务器端技术,服务器把数据以session的形式保存在服务器中
-
在分布式情况下,session会失效,比如项目部署在多台服务器中,服务器之间无法共享session,用户在A服务器上已经登录了,但当负载均衡跳转到服务器B时,由于B服务器并没有用户的登录信息,session就失效了,用户就退出了登录。
-
一旦服务器关闭或重启也会导致session会话失效,因此如果项目部署在多台服务器中,就需要解决session共享的问题。
这个时候我们可以使用Spring Session技术,Spring Session 就是使用Spring 中的代理过滤器,将所有的 Session 操作拦截下来,自动的将数据同步到Redis 中,或者自动的从 Redis 中读取数据。
这里我用一个用户登录的小demo来演示一下Spring Session的效果,将用户登录信息存储在session中。
第一步:导入依赖
<!--session-redis-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
第二部:编写配置文件和配置类
spring.redis.port=6379
spring.redis.database=1
spring.redis.host=localhost
package com.zym.hikproject.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.ConfigureRedisAction;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
@Configuration
//设置session过期时间,默认是1800秒
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 30 * 60)
public class HttpSessionConfig {
@Bean
public static ConfigureRedisAction configureRedisAction(){
return ConfigureRedisAction.NO_OP;
}
}
第三步:测试登陆接口
(spring-session会自动帮我们把session存入redis中,我们只需要对session进行简单操作即可)
登陆成功后,可以看到session已经保存到了redis中。
@PostMapping("/login")
@ApiOperation("用户登录")
public String login(HttpServletRequest request,
@RequestParam("username") String username,
@RequestParam("password") String password) throws Exception {
User user = userService.checkUser(username, password);
HttpSession session = request.getSession();
if (user != null){
session.setAttribute("userLogin", user);
return "登录成功";
}else {
return "登录失败";
}
}
第四步:测试从redis中获取session,然后从session中获取用户信息。
(spring-session会自动帮我们从redis取出session)
@GetMapping("/get")
public User getSession(HttpServletRequest request){
HttpSession session = request.getSession();
return (User) session.getAttribute("userLogin");
}
使用postman测试/get接口,成功获得用户信息。
更多推荐
所有评论(0)