SpringBoot精选Spring Boot

SpringBoot 全家桶 | SpringSession +

2020-09-03  本文已影响0人  码农StayUp

本文源码:Gitee·点这里

官方介绍

Spring Session 提供了一个 API 和实现,用于管理用户的会话信息,同时使其在不依赖于特定于应用程序容器的解决方案的情况下,可以轻松地支持集群会话。它还提供了透明的集成:

Spring Session 支持多种会话存储方式,本次讲解我们使用 Redis 实现

Spring Session Data Redis

使用 Redis 实现 Spring Session 会话共享

pom.xml 文件

主要引入spring-session-data-redis包和spring-boot-starter-data-redis,同时为了演示方便,还引入了webfastjsonlogging

<dependencies>
    <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>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.73</version>
    </dependency>
   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>
</dependencies>

application.yml 配置

spring:
  session:
    store-type: redis
    timeout: 8H
    redis:
      namespace: spring:session
  redis:
    host: localhost
    port: 6379
    database: 0

redis序列化方式配置

默认序列化方式存入的数据会出现乱码情况,而官方为我们提供了多种序列化方式,在这里我们使用 GenericFastJsonRedisSerializer
其他方式请参阅源码RedisSerializer接口的实现。

@Configuration
public class RedisConfig {

    @Bean("springSessionDefaultRedisSerializer")
    public RedisSerializer<Object> redisSerializer() {
        return new GenericFastJsonRedisSerializer();
    }

}

测试

有了上边的配置,就已经实现了 Redis Session 共享了,我们简单来做个测试

User 实体类
public class User implements Serializable {
    private Long id;
    private String username;
    private String password;
    // get/set...
}
UserService

只有一个方法getUserByUsernameAndPassword,用于模拟从数据库取用户信息

@Service
public class UserService {

    public User getUserByUsernameAndPassword(String username, String password) {
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setId(1L);
        return user;
    }
}
UserController

只有两个方法logingetData简单测试

@RestController
@RequestMapping("/user")
public class UserController {

    private final Logger log = LoggerFactory.getLogger(this.getClass());

    @Resource
    private UserService userService;

    @PostMapping("/login")
    public String login(String username, String password, HttpSession session) {
        User user = userService.getUserByUsernameAndPassword(username, password);
        String userJson = JSONObject.toJSONString(user);
        session.setAttribute("user", userJson);
        log.info("sessionId: {}, user: {}", session.getId(), userJson);
        return JSONObject.toJSONString(user);
    }

    @GetMapping("/data")
    public String getData(HttpSession session) {
        Object user = session.getAttribute("user");
        String userJson = JSONObject.toJSONString(user);
        log.info("sessionId: {}, user: {}", session.getId(), userJson);
        return userJson;
    }
}

使用 Postman 分别调用上边两个方法:

login将用户信息取出并存入 Session,此时 Spring Session 会将 Session 信息存储 Redis 中,可以查看 Redis 中的信息

getData调用此方法,发现用户信息可以取出

1.png 2.png

参考

完整代码

springboot-session-redis

mm.jpg
上一篇 下一篇

猜你喜欢

热点阅读