我们之前实现Java的会话管理功能,主要是使用Cookie或Session。

  1. Cookie是客户端技术,服务器把数据以cookie的形式保存在用户的浏览器中

  2. Session是服务器端技术,服务器把数据以session的形式保存在服务器中

  3. 在分布式情况下,session会失效,比如项目部署在多台服务器中,服务器之间无法共享session,用户在A服务器上已经登录了,但当负载均衡跳转到服务器B时,由于B服务器并没有用户的登录信息,session就失效了,用户就退出了登录。

  4. 一旦服务器关闭或重启也会导致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接口,成功获得用户信息。
在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐