006.Spring Boot Session Redis Sample

一、目錄結構

目錄結構

二捂寿、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.airkisser</groupId>
    <artifactId>spring-boot-sample-session-redis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>spring-boot-sample-session</name>
    <description>Spring boot session redis sample</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.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-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>${artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

三算色、application.properties

# 根據(jù)實際情況設置redis的host阳欲,port,password
# 此案例中redis無密碼毡咏,host為localhost驮宴,port為6379
spring.redis.host=localhost
spring.redis.port=6379

四、java

Application.java

package com.airkisser;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

HttpSessionConfig.java

package com.airkisser.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration
// 創(chuàng)建實現(xiàn)Filter的類呕缭,名為"springSessionRepositoryFilter"的Bean
@EnableRedisHttpSession
public class HttpSessionConfig {

}

HelloController.java

package com.airkisser.web;

import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@Controller
public class HelloController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    @ResponseBody
    public Map<String, Object> hello(HttpServletRequest request) {
        String ip = getClientIp(request);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("sessionId", request.getSession().getId());
        map.put("ip", ip);
        System.out.println(ip + "\t" + request.getSession().getId());
        return map;
    }

    /**
     * 在很多應用下都可能有需要將用戶的真實IP記錄下來堵泽,這時就要獲得用戶的真實IP地址,在JSP里恢总,獲取客戶端的IP地
     * 址的方法是:request.getRemoteAddr()迎罗,這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等
     * 反向代理軟件就不能獲取到客戶端的真實IP地址了片仿。
     * 但是在轉發(fā)請求的HTTP頭信息中纹安,增加了X-FORWARDED-FOR信息。用以跟蹤原有的客戶端IP地址和原來客戶端請求的服務器地址砂豌。
     */
    public static String getClientIp(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        if (!StringUtils.isEmpty(ip)) {
            ip = ip.split(",")[0];
        }
        return ip;
    }

}

五厢岂、啟動Redis

Redis啟動界面

六、分別部署該應用到端口為8080和8090的Tomcat服務器上阳距,并啟動這兩個Tomcat

兩個Tomcat服務器

七塔粒、配置Nignix負載均衡并啟動Nginx

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    upstream nginx_tomcat{
        #ip_hash;
        # 可以通過weight給不同的服務器分配不同的訪問量,
        # 默認情況下是1:1,即nginx會將他攔截到的請求以2:1的比例分配給對應的服務器
        server 127.0.0.1:8080 weight=2;
        server 192.168.0.104:8090 weight=1;
    }

    server {
        # 偵聽80端口 
        listen       80;
        server_name  localhost;
        
        location / {
            # 設置主機頭和客戶端真實地址筐摘,以便服務器獲取客戶端真實IP
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # 禁用緩存
            proxy_buffering off;
            # 反向代理的地址
            proxy_pass http://nginx_tomcat;
        }
    }

}

八卒茬、結果

在瀏覽器上輸入http://localhosthttp://127.0.0.1http://192.168.0.104多次,發(fā)現(xiàn)兩個服務器都接收到了請求咖熟。

TomcatV1

TomcatV2
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末圃酵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子馍管,更是在濱河造成了極大的恐慌郭赐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咽斧,死亡現(xiàn)場離奇詭異堪置,居然都是意外死亡,警方通過查閱死者的電腦和手機张惹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岭洲,“玉大人宛逗,你說我怎么就攤上這事《苁#” “怎么了雷激?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵替蔬,是天一觀的道長。 經(jīng)常有香客問我屎暇,道長承桥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任根悼,我火速辦了婚禮凶异,結果婚禮上,老公的妹妹穿的比我還像新娘挤巡。我一直安慰自己剩彬,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布矿卑。 她就那樣靜靜地躺著喉恋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪母廷。 梳的紋絲不亂的頭發(fā)上轻黑,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音琴昆,去河邊找鬼氓鄙。 笑死,一個胖子當著我的面吹牛椎咧,可吹牛的內(nèi)容都是我干的玖详。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼勤讽,長吁一口氣:“原來是場噩夢啊……” “哼蟋座!你這毒婦竟也來了?” 一聲冷哼從身側響起脚牍,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤向臀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后诸狭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體券膀,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年驯遇,在試婚紗的時候發(fā)現(xiàn)自己被綠了芹彬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡叉庐,死狀恐怖舒帮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤玩郊,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布肢执,位于F島的核電站,受9級特大地震影響译红,放射性物質發(fā)生泄漏预茄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一侦厚、第九天 我趴在偏房一處隱蔽的房頂上張望耻陕。 院中可真熱鬧,春花似錦假夺、人聲如沸淮蜈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梧田。三九已至,卻和暖如春侧蘸,著一層夾襖步出監(jiān)牢的瞬間裁眯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工讳癌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留穿稳,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓晌坤,卻偏偏與公主長得像逢艘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子骤菠,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理它改,服務發(fā)現(xiàn),斷路器商乎,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,810評論 6 342
  • 摘要: 原創(chuàng)出處 www.bysocket.com 「泥瓦匠BYSocket 」歡迎轉載央拖,保留摘要,謝謝鹉戚! 『產(chǎn)品...
    子木聊出海閱讀 1,613評論 5 50
  • 盡管走下去/不必逗留著/去采鮮花來保存/因為在這一路上/花自然會繼續(xù)開放鲜戒。
    solsolo閱讀 405評論 0 0
  • 陳家大七閱讀 200評論 0 0