SpringBoot 集成 redis 实现分布式 session 共享

session 是服务器用来保存用户操做的一系列会话信息,由 Web 容器进行管理。单机状况下,不存在 session 共享的状况,分布式状况下,若是不进行 session 共享会出现请求落到不一样机器要重复登陆的状况 。单点登陆能够用 cookie+redis 的方式,第一次登录生成 token,将 token 和用户以键值对的方式存入 redis。并将 token 写入cookie 返回到浏览器。之后每次请求 cookie 都会携带上 token。服务端获取 token 而后去 redis 中查找是否存在此用户从而实现单点登陆。java

项目代码结构图结构web

1571122427195

准备工做redis

启动 eureka 注册中心 eureka-register,而后新建两个 springboot 服务分别是 four-sample 和 five-sample。spring

以 four-sample 演示操做浏览器

引入依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
	    <!--spring boot 与redis应用基本环境配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--spring session 与redis应用基本环境配置,须要开启redis后才可使用,否则启动Spring boot会			报错 -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
复制代码

属性配置

application.yml 资源文件中添加 redis 和 eureka 相关配置springboot

server:
  port: 8086
spring:
  application:
    name: spring-cloud-producer1
  redis:
      host: 127.0.0.1
      port: 6379
      timeout: 5000ms
      password:
      database: 0
      jedis:
        pool:
          max-active: 50
          max-wait: 3000ms
          max-idle: 20
          min-idle: 2
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
复制代码

主程序

package com.tuhu.foursample;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @author chendesheng
 * @since 2019-08-06
 */
@SpringBootApplication
@EnableEurekaClient
@EnableRedisHttpSession
@RestController
public class FourSampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(FourSampleApplication.class, args);
    }


    @GetMapping(value="/setSession")
    public String setSession(HttpServletRequest request){
        Map<String,Object> map = new HashMap(10);
        map.put("name","超级管理员");
        map.put("account","admin");
        request.getSession().setAttribute("userSession",map);
        String sessionId = request.getSession().getId();
        return sessionId;
    }


}
复制代码

使用 @EnableRedisHttpSession 来开启 spring session 支持,使用 @EnableEurekaClient 将服务注册到注册中兴。five-sample 服务的配置如法炮制,只需修改端口号和程序名便可。服务器

five-sample 服务配置完之后,咱们须要在主程序拿到 userSession,看看 session 是否与服务 four-sample 里的一致。five-sample 主程序代码以下:cookie

package com.tuhu.fivesample;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @author chendesheng
 * @since 2019-08-06
 */
@SpringBootApplication
@EnableEurekaClient
@RestController
@EnableRedisHttpSession
public class FiveSampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(FiveSampleApplication.class, args);
    }

    @GetMapping(value="/getSession")
    public Map<String,Object> getSession(HttpServletRequest request){

        String sessionId = request.getSession().getId();
        Object obj = request.getSession().getAttribute("userSession");
        Map<String,Object> map = new HashMap(10);
        map.put("sessionId",sessionId);
        map.put("user",obj);
        return map;

    }

}
复制代码

测试

如今咱们启动注册中心 eureka-register 和两个服务 four-sample 和 five-samplesession

用 postman 请求 four-sample,咱们能够看到app

1571121861255

再用 postman 请求 five-sample,咱们能够看到

1571121906947

ok 这样咱们就实现了 session 共享,能够看到 SpringBoot 集成 redis 实现 session 共享是如此的简单,仅仅须要一个依赖就能够解决。咱们写了一些代码,也作了一些配置,可是全都和 Spring Session 无关,配置是配置 Redis,代码就是普通的 HttpSession,和 Spring Session 没有任何关系!惟一和 Spring Session 相关的,可能就是我在一开始引入了 Spring Session 的依赖吧!

相关文章
相关标签/搜索