springboot集成redis和springsession做session服务器

一. 简介

         redis的安装可以参照博主的另一篇文章: linux下安装redis4.0.11

         springboot2.0整合redis可以参照博主的另一篇文章: springboot2.0整合redis

          在分布式项目中,为了保持无状态的应用,用redis做session服务器。springsession可以和redis很好的配合。

二. 代码

2.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!-- jackson序列化 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

        <!-- spring session -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

2.2 application.yml

server:
  port: 8080


# redis相关配置
spring:
  redis:
    database: 0
    host: redis服务器IP
    port: 6379
    password: 密码

2.3 RedisConfig

package com.example.demo.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * @author yuanshushu
 * @date 2018/9/1
 * @description REDIS配置类
 */
@Configuration
@EnableRedisHttpSession
public class RedisConfig {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 使用Jackson2JsonRedisSerialize 替换默认的jdkSerializeable序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        // 设置value的序列化规则和 key的序列化规则
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }


}

2.4 SessionController

2.4.1 8080端口的Controller

打印session信息和向session中存储用户信息

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

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

/**
 * @author yuanshushu
 * @date 2018/9/1
 * @description SESSION控制类
 */
@RestController
public class SessionController {

    @GetMapping("/test")
    public Map<String, Object> testSessionId(HttpServletRequest request) {

        Map<String, Object> sessionIdPortMap = new HashMap<String, Object>();

        // 获取session信息
        sessionIdPortMap.put("sessionId:", request.getSession().getId());
        sessionIdPortMap.put("服务器端口:", request.getServerPort());

        // 向session中保存用户信息 key规则: user + "_" + uid
        request.getSession().setAttribute("user_1", "{uid:1,username:[email protected]}");

        return sessionIdPortMap;
    }


}

2.4.2 8081端口的controller

 打印session信息和获取session中用户信息

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

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

/**
 * @author yuanshushu
 * @date 2018/9/1
 * @description SESSION控制类
 */
@RestController
public class SessionController {

    @GetMapping("/test")
    public Map<String, Object> testSessionId(HttpServletRequest request) {

        Map<String, Object> sessionIdPortMap = new HashMap<String, Object>();

        // 获取session信息
        sessionIdPortMap.put("sessionId:", request.getSession().getId());
        sessionIdPortMap.put("服务器端口:", request.getServerPort());

        // 获取session中uid为1的用户的信息
        String user_1 = (String) request.getSession().getAttribute("user_1");
        sessionIdPortMap.put("user_1", user_1);

        return sessionIdPortMap;
    }


}

2.5 启动类

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

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

三. 测试

启动项目,访问http://localhost:8080/test路径,页面返回如下:

此时,可以通过redis desktop manager查看,有一个session生成,时间默认为半小时。

此时,将项目复制一份,端口改为8081,访问http://localhost:8081/test,仍然得到相同的sessionId,并可以得到session中存储的用户信息:

说明session已经被redis共享了。

此时,如果将项目关闭,再启动,仍然会是这个sessionId(默认半小时失效)。

在项目中,可以通过一个工具类,封装获取session的方法,然后对该session做操作。

猜你喜欢

转载自blog.csdn.net/qq_35206261/article/details/82289066