Spring Boot + Spring Session + Redis

簡介

本文中的項目使用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

對於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
若效果與下圖效果一致,則創建成功
這裏寫圖片描述

項目代碼鏈接http://download.csdn.net/detail/qq_17616169/9681909
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章