一. 简介
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做操作。