一、目錄結構
目錄結構
二捂寿、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://localhost
或http://127.0.0.1
或http://192.168.0.104
多次,發(fā)現(xiàn)兩個服務器都接收到了請求咖熟。
TomcatV1
TomcatV2