Spring boot入门系列(三):使用Redis进行Session的管理


        前言:本文所用jdk版本为:jdk1.8.0_111版本;Spring boot1.5.8版本,工程仍沿用上一篇文章的工程。


一、准备好Redis服务

        提到Redis相信很多人都知道它是做什么的,这里不过多做阐述,本文主要看Spring boot如何集成Redis来存储Session,所以首先要准备好一个可用的redis服务。


二、 添加pom依赖

		
			org.springframework.boot
			spring-boot-starter-redis
			1.4.7.RELEASE
		
		
			org.springframework.session
			spring-session-data-redis
		
        这里引入了两个模块:
  • spring-boot-starter-redis模块:主要用于提供RedisConnectionFactory去实现redis的连接,它默认提供了Jedis的连接池,如:JedisPoolConfig。
  • spring-session-data-redis模块:集成了spring-session和spring-data-redis,提供了一套session与redis结合的解决方案。

三、 在配置文件中添加配置

        application.properties中添加以下配置
spring.redis.host=localhost  
spring.redis.port=6379
        这里只添加了默认的连接ip和端口配置,对于redis的常规配置项如最大连接数、响应时长等等,皆可在此进行动态的配置。

四、 添加Bean配置

    2.1将RedisConnectionFactory注册为Bean

        创建com.aierlice.configuration包,创建PublicConfig.java文件,内容如下:
package com.aierlice.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * Spring的公共配置类
 * 
 * @author LIU
 * @Date 2017-9-21
 */
@EnableRedisHttpSession
@Configuration
public class PublicConfig {

	@Bean
	public RedisConnectionFactory jedisConnectionFactory() {
		return new JedisConnectionFactory();
	}

}
        这里一定要注意的一点就是,在Spring boot中无论是所有的基于Java的bean配置,还是基于注解的bean配置,都必须在主程序入口的后面,即main方法所在的java文件启动时会默认扫描与其平级的包下的所有子文件配置,所以这一点一定要注意,千万不能将配置写在其上级目录中,这样是无法载入的。

    2.2 在配置类上添加注解@EnableRedisHttpSession

        上面代码中已经添加了该注解,该注解是开启Redis的Session管理。
        到目前为止,所有的配置都已经完成,接下来我们写个测试方法测试一下

五、添加测试方法

        在com.aierlice.basis.web包中创建SessionController.java文件,内容如下:
package com.aierlice.basis.web;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class SessionController {
	
	@GetMapping("login/{name}")
	@ResponseBody
	public Object login(@PathVariable("name") String name,HttpServletRequest request){
		request.getSession().setAttribute("login", name);
		return "登录成功";		
	}
	
	@GetMapping("/getSession")
	@ResponseBody
	public Object getLoginSession(HttpServletRequest request) {
		Object result = request.getSession().getAttribute("login");
		return result != null ? result : "session没有获取到login对应的数据";
	}

}


        这里写了两个方法,一个是存session,一个是取session,相信大家都能看得懂上面的代码,下面我们来测试一下。

        1. 首先启动redis服务;
        2. 再启动主程序入口的main方法,如果一切正常,则会正常启动起来;
        3. 在浏览器中输入:http://localhost:8080/login/Tom  回车,如果一切正常,浏览器会打印出"登录成功";
        4. 接下来访问: http://localhost:8080/getSession  回车,此时如果我们看到浏览器打印出"Tom",则证明我们的session已经成功地保存了。

        到了这一步,也许有人会说,session是保存成功了,但是你如何证明你的session是保存在redis中的,而不是传统的保存在tomcat内存中的呢?下面我们就来论证一下
        1. 首先,我们将我们的工程关掉后重新启动起来,然后浏览器直接访问: http://localhost:8080/getSession 回车,正常情况下我们还是会看到打印出来的"Tom";
        2. 然后我们将redis里的数据清空,我们在cmd中打开一个redis客户端连接到同一个redis服务,然后输入命令 flushall 进行数据的清除,清除后,再通过浏览器访问http://localhost:8080/getSession,我们会看到此时浏览器打印出"session没有获取到login对应的数据"
        这里我们就可以证明session是保存在redis中的了。

        接下来我们会研究到分布式系统中,在分布式系统中要保持session同步,我们可以采用这种方法进行多系统间的session共享,可以说是非常方便的解决方案。






你可能感兴趣的:(Spring,boot,入门系列)