簡介
本文中的項目使用Maven來管理項目依賴,使用Spring Session和Redis的組合來代替原有的HttpSession實現Session在不同項目之間的共享
項目結構
構建Spring Boot
pom.xml
在pom.xml中入相關依賴
<!-- 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>
</dependencies>
<!-- 打包spring boot應用 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Application.java
實現Spring Boot的啓動main函數
package com.spring.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
// 自動配置Spring框架
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
測試
測試代碼
創建一個類HelloWorldController用於測試
package com.spring.demo;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@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>
Spring Session配置
創建一個Spring配置,用於創建一個支持Spring Session的Servlet Filter來代替原有的HttpSession的實現。
package com.spring.demo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration;
//這個類用配置redis服務器的連接
//maxInactiveIntervalInSeconds爲SpringSession的過期時間(單位:秒)
@EnableRedisHttpSession(maxInactiveIntervalInSeconds= 1800)
public class SessionConfig {
@Bean
public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory connection = new JedisConnectionFactory();
return connection;
}
}
JedisConnectionFactory
默認連接端口:6379
默認連接地址:localhost
需要修改則可以使用JedisConnectionFactory的setPort()方法和setHostName()方法來修改默認的端口和連接地址
這裏可以引入配置文件使Redis的配置更加靈活
創建配置文件application.properties
redis.hostname = localhost
redis.port = 6379
在類SessionConfig中引入配置文件的值
修改後的SessionConfig類代碼如下:
package com.spring.demo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration;
//這個類用配置redis服務器的連接
//maxInactiveIntervalInSeconds爲SpringSession的過期時間(單位:秒)
@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過濾器。
package com.spring.demo;
import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;
//初始化Session配置
public class SessionInitializer extends AbstractHttpSessionApplicationInitializer{
public SessionInitializer() {
super(SessionConfig.class);
}
}
測試
以上已經完成了Spring Boot + Spring Session +Redis的配置
測試是否可以在不同的容器(e.g. Tomcat),不同的項目中都訪問到同一個Session
運行Redis
拷貝一個項目
項目結構與主項目相同
修改容器端口
在測試項目的Application.java類中,實現EmbeddedServletContainerCustomizer接口,修改Spring Boot中自帶Tomcat的接口
修改後的代碼爲
package com.spring.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
@SpringBootApplication
public class Application implements EmbeddedServletContainerCustomizer {
// 自動配置Spring框架
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
//修改Spring Boot自帶Tomcat的接口
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setPort(8090);
}
}
實現Session的讀寫
添加測試方法
主項目
在主項目中的類HelloWorldController中添加一個TestSession方法
用於保存和讀取Session
修改後的代碼如下
package com.spring.demo;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@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方法
修改後的代碼爲
package com.spring.demo;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@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){
String a = (String) req.getSession().getAttribute("age");
return a;
}
}
開始測試
分別運行主項目和測試項目的Application.java文件
主項目
測試項目
驗證
先登錄”http://localhost:8080/tsession/30“保存Session信息,結果如下圖所示:
再登錄”http://localhost:8090/tsession/28“,測試是否可以讀取到之前的信息:若結果如下圖,這表示測試成功:
優化
若每一次創建項目都要寫一次的Session的配置,那麼代碼的複用性太差,那麼不如把Session的配置單獨打包出來,之後只需要在項目中加入一個依賴就可以實現Spring Session的功能。
項目結構
pom.xml
<!-- 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>
配置類SessionConfig和加載類SessionInitializer的代碼與之前沒有變化
Maven install
由於項目依賴是由Maven來管理的,那麼使用Maven install將項目安裝到Maven的本地倉庫當中
測試
創建測試項目
pom.xml
先獲取去需要依賴的項目的Maven位置,位置在安裝到本地倉庫的項目的pom.xml文件中獲取
將位置加入到測試項目中
其他測試文件
Application.java文件和HelloWorldController文件代碼與之前的一致,以下就不貼出代碼了
開始測試
運行Redis-運行測試項目中的Application.java文件-訪問”http://localhost:8080/tsession/35”
若效果與下圖效果一致,則創建成功