springboot集成redis和springsession做session服务器

一. 简介

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

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

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

二. 代码

2.1 pom.xml



    4.0.0

    com.example
    demo
    0.0.1-SNAPSHOT
    jar

    demo
    Demo project for Spring Boot

    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.4.RELEASE
         
    

    
        UTF-8
        UTF-8
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
        
            org.springframework.boot
            spring-boot-starter-data-redis
        

        
        
            com.fasterxml.jackson.core
            jackson-databind
        

        
        
            org.springframework.session
            spring-session-data-redis
        

    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    



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 redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate 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 testSessionId(HttpServletRequest request) {

        Map sessionIdPortMap = new HashMap();

        // 获取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 testSessionId(HttpServletRequest request) {

        Map sessionIdPortMap = new HashMap();

        // 获取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路径,页面返回如下:

springboot集成redis和springsession做session服务器_第1张图片

 

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

springboot集成redis和springsession做session服务器_第2张图片

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

springboot集成redis和springsession做session服务器_第3张图片

 

说明session已经被redis共享了。

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

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

 

 

 

你可能感兴趣的:(技术框架)