本次开发环境:idea2016.3.4 +jdk1.8+maven3.3.9+redis+springboot+jedis

本文中的项目使用Maven来管理项目依赖,使用Spring Session和Redis的组合来代替原有的HttpSession实现Session在不同项目之间的共享

项目结构:

构建Spring Boot

pom文件如下

<modelVersion>4.0.0</modelVersion>

<groupId>com.cky.sessionshare</groupId>
<artifactId>spring-session-share</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<!-- spring boot 基本环境 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.1.RELEASE</version>
</parent> <properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--spring boot web应用基本环境配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

Application.java

实现Spring Boot的启动main函数

@SpringBootApplication
public class Application {
// 自动配置Spring框架
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

测试

测试代码

创建一个类HelloWorldController用于测试

@RestController
public class HelloWorldController { @RequestMapping("/index/{name}")
@ResponseBody
public String index(@PathVariable String name) { if (null == name) {
name = "boy";
} return "hello world " + name;
}
}
运行Application.java来启动Spring Boot,访问”http://localhost:8080/index/陈冠希”出现以下页面,说明Spring Boot部署成功

加入Spring Session框架

pom.xml

引入Spring Session和Redis需要的依赖

 <!--spring boot 与redis应用基本环境配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency> <!--spring session 与redis应用基本环境配置,需要开启redis后才可以使用,不然启动Spring boot会报错 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
</dependencies>

Spring Session配置

创建一个Spring配置,用于创建一个支持Spring Session的Servlet Filter来代替原有的HttpSession的实现。

@EnableRedisHttpSession(maxInactiveIntervalInSeconds= 1800)
public class SessionConfig { @Value("${redis.hostname:localhost}")
String HostName; @Value("${redis.port:6379}")
int Port;
@Bean
public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory connection = new JedisConnectionFactory();
return connection;
}
}

JedisConnectionFactory

默认连接端口:6379 
默认连接地址:localhost 
需要修改则可以使用JedisConnectionFactory的setPort()方法和setHostName()方法来修改默认的端口和连接地址

这里可以引入配置文件使Redis的配置更加灵活

创建配置文件application.properties
redis.homename = localhost
redis.port = 6379
在类SessionConfig中引入配置文件的值

修改后的SessionConfig类代码如下:

@EnableRedisHttpSession(maxInactiveIntervalInSeconds= 1800)
public class SessionConfig { @Value("${redis.hostname:localhost}")
String HostName; @Value("${redis.port:6379}")
int Port;
@Bean
public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory connection = new JedisConnectionFactory();
connection.setPort(Port);
connection.setHostName(HostName); return connection;
}
}

加载Spring Session配置

加载Spring Session配置,使得Servlet容器在每一次请求时都使用我们的springSessionRepositoryFilter过滤器。
public class SessionInitializer  extends AbstractHttpSessionApplicationInitializer{
public SessionInitializer (){
super(SessionConfig.class);
} }

测试

以上已经完成了Spring Boot + Spring Session +Redis的配置 
测试是否可以在不同的容器(e.g. Tomcat),不同的项目中都访问到同一个Session

运行Redis

拷贝一个项目

项目结构与主项目相同

修改容器端口

修改Spring Boot中自带Tomcat的接口 
在application.properties中加入server.port=8090

实现Session的读写

添加测试方法
主项目

在主项目中的类HelloWorldController中添加一个TestSession方法 
用于保存和读取Session 
修改后的代码如下

@RestController
public class HelloWorldController { @RequestMapping("/index/{name}")
@ResponseBody
public String index(@PathVariable String name) { if (null == name) {
name = "boy";
} return "hello world " + name;
} @RequestMapping("/tsession/{age}")
@ResponseBody
public String TestSession(HttpServletRequest req, HttpServletResponse resp, @PathVariable String age){
req.getSession().setAttribute("age", age);
String a = (String) req.getSession().getAttribute("age"); return a;
}
}
测试项目

为了测试是否可以读取Session,测试项目的Session不做保存操作 
修改测试项目的HelloWorldController类中的TestSession方法 
修改后的代码为

@RestController
public class WelcomeController { @RequestMapping("/welcome/{name}")
@ResponseBody
public String index(@PathVariable String name) { if (null == name) {
name = "edison";
} return "welcome " + name;
} @RequestMapping("/tsession/{age}")
@ResponseBody
public String TestSession(HttpServletRequest req, HttpServletResponse resp, @PathVariable String age){
String a = (String) req.getSession().getAttribute("age");
return a;
}
}

开始测试

分别运行主项目和测试项目的Application.java文件

验证

先登录”http://localhost:8080/tsession/88“保存Session信息,结果如下图所示:

再登录”http://localhost:8090/tsession/88“,测试是否可以读取到之前的信息:若结果如下图,这表示测试成功:

这时用redis desktop manager查看redis发现数据

用谷歌查看刚才传递的给服务的cookie

优化

若每一次创建项目都要写一次的Session的配置,那么代码的复用性太差,那么不如把Session的配置单独打包出来,之后只需要在项目中加入一个依赖就可以实现Spring Session的功能。

项目结构

pom文件如下

<?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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.springboot.sessionshare</groupId>
<artifactId>springbootsessionshare</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version> <name>A Camel Route</name> <!-- spring boot 基本环境 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.1.RELEASE</version>
</parent> <dependencies>
<!--spring boot web应用基本环境配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!--spring boot 与redis应用基本环境配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency> <!--spring session 与redis应用基本环境配置,需要开启redis后才可以使用,不然启动Spring boot会报错 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency> </dependencies> </project>
配置类SessionConfig和加载类SessionInitializer的代码与之前没有变化

Maven install

由于项目依赖是由Maven来管理的,那么使用Maven install将项目安装到Maven的本地仓库当中

测试

创建测试项目

pom.xml

先获取去需要依赖的项目的Maven位置,位置在安装到本地仓库的项目的pom.xml文件中获取

将位置加入到测试项目中

设置端口

server.port=8050
其他测试文件

Application.java文件和HelloWorldController文件代码与之前的一致,以下就不贴出代码了

开始测试

运行Redis-运行测试项目中的Application.java文件-访问”http://localhost:8050/tsession/100”

若效果与下图效果一致,则创建成功


												

使用idea,springboot,springsession,redis实现分布式微服务的session 共享的更多相关文章

  1. 整合SPRING CLOUD云服务架构 - 企业分布式微服务云架构构建

    整合SPRING CLOUD云服务架构 - 企业分布式微服务云架构构建 1.   介绍 Commonservice-system是一个大型分布式.微服务.面向企业的JavaEE体系快速研发平台,基于模 ...

  2. .Net Core 分布式微服务框架介绍 - Jimu

    系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 近些年一直浸淫在 .Net 平台做企业应用开 ...

  3. Net Core 分布式微服务框架

    Jimu : .Net Core 分布式微服务框架介绍 https://www.cnblogs.com/grissom007/p/9291345.html 一.前言 近些年一直浸淫在 .Net 平台做 ...

  4. Surging 分布式微服务框架使用入门

    原文:Surging 分布式微服务框架使用入门 前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与S ...

  5. [转载]Surging 分布式微服务框架使用入门

    前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架 ...

  6. 推荐一款分布式微服务框架 Surging

    surging   surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希,随机,轮询,压力最小优先作为 ...

  7. 我的分布式微服务框架:YC-Framework

    YC-Framework官方文档:http://framework.youcongtech.com/ YC-Framework源代码:https://github.com/developers-you ...

  8. Thrift搭建分布式微服务(二)

    第二篇 连接池  连接池配置,请前往Thrift搭建分布式微服务(一)  下面要介绍的其实不是单一的连接池,应该说是连接池集合.因为它要管理多个Tcp Socket连接节点,每个服务节点都有设置了自己 ...

  9. Thrift搭建分布式微服务1

    Thrift搭建分布式微服务 一.Thrift是什么? 关于Thrift的基本介绍,参看张善友的文章Thrift简介. 二.为什么使用微服务? 在公司的高速发展过程中,随着业务的增长,子系统越来越多. ...

随机推荐

  1. 视频采集,存成avi

    视频采集,存成aviunit Unit1; interface uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Form ...

  2. C#实现支持单点登录的一个存储用户信息的类

    网上有很多介绍单点登录的文章,但多为架构设计以及概念性文章,而本文将介绍单点登录的具体具体实现 利用哈希表,作为保存登录用户的队列        private static Hashtable m_ ...

  3. vim使用方法:

    vim使用方法: 模式: 编辑模式.未编辑模式.命令行模式 i 插入形式进入编辑模式 a 增加 o 下行编辑 O 上行插入 : 进入命令行模式 esc 退出编辑模式 wq 保存文件 yy 复制 p 粘 ...

  4. 使用github的流程

    使用github的流程 在实际项目开发中,按照如下步骤使用git进行代码管理 1.项目经理在开发之初,创建好仓库,上传项目的框架.组员分支 2.组员克隆项目框架,同步分支,按分工开发,在分支提交代码 ...

  5. php获取微信用户信息(没测试过)

    <?php /** * 通过$appid.$appsecret获得基础支持的接口唯一凭证access_token,返回值为array类型 */ function get_access_token ...

  6. gtftools软件简单介绍(我自己不建议用,因为我发现不好用)

    1)背景 生物信息学研究经常涉及计算或提取基因的各种特征,如基因ID作图,GC含量计算和不同类型的基因长度,通过操纵基因模型,这些模型通常以GTF格式注释,可从ENSEMBL或GENCODE数据库获得 ...

  7. Java RSA 生成公钥 私钥

    目前为止,RSA是应用最多的公钥加密算法,能够抵抗已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准. RSA算法中,每个通信主体都有两个钥匙,一个公钥(Public Key)用来对数据进行加密 ...

  8. easyUIDataGrid分页

    package com.cn.eport.util; import java.util.List; /** * * * @author zh * */ public class DataGrid im ...

  9. webpack 常用插件及作用

    copy-webpack-plugin :复制文件到目标文件夹.在开发时使用热模替换,(没有生成dist 文件夹,都在内存中),如果想引用某一个js文件,直接写script标签是找不到的,因为服务器内 ...

  10. linux - 文件拆分

    核心: split 例如,把一个文件以10万行为单位拆分文件, 并且以perfix作为前缀,3位数数字,从000开始递增 split -l 100000 filename.txt -d -a 3 pe ...