diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 7c01407..1d89b37 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -10,9 +10,10 @@
-
-
+
+
+
@@ -21,6 +22,7 @@
+
\ No newline at end of file
diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
new file mode 100644
index 0000000..cd8ba92
--- /dev/null
+++ b/.idea/dataSources.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ mysql.8
+ true
+ com.mysql.cj.jdbc.Driver
+ jdbc:mysql://localhost:3306/beacon_cloud
+ $ProjectFileDir$
+
+
+
\ No newline at end of file
diff --git a/beacon-api/pom.xml b/beacon-api/pom.xml
index f28c790..b4ebb81 100644
--- a/beacon-api/pom.xml
+++ b/beacon-api/pom.xml
@@ -60,6 +60,12 @@
1.0-SNAPSHOT
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+
+
\ No newline at end of file
diff --git a/beacon-api/src/main/java/com/mashibing/ApiStarterApp.java b/beacon-api/src/main/java/com/mashibing/ApiStarterApp.java
index 6f4263a..0af7d4e 100644
--- a/beacon-api/src/main/java/com/mashibing/ApiStarterApp.java
+++ b/beacon-api/src/main/java/com/mashibing/ApiStarterApp.java
@@ -3,6 +3,7 @@ package com.mashibing;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @author dch
@@ -10,6 +11,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
*/
@SpringBootApplication
@EnableDiscoveryClient
+@EnableFeignClients
public class ApiStarterApp {
public static void main(String[] args) {
diff --git a/beacon-api/src/main/java/com/mashibing/api/client/BeaconCacheClient.java b/beacon-api/src/main/java/com/mashibing/api/client/BeaconCacheClient.java
new file mode 100644
index 0000000..9d4a1be
--- /dev/null
+++ b/beacon-api/src/main/java/com/mashibing/api/client/BeaconCacheClient.java
@@ -0,0 +1,12 @@
+package com.mashibing.api.client;
+
+import org.springframework.cloud.openfeign.FeignClient;
+
+/**
+ * @author dch
+ * @create 2024-03-19 23:56
+ */
+@FeignClient(value="beacon-cache")
+public class BeaconCacheClient {
+
+}
diff --git a/beacon-api/src/main/java/com/mashibing/api/controller/SmsController.java b/beacon-api/src/main/java/com/mashibing/api/controller/SmsController.java
index 3574e5f..19a4381 100644
--- a/beacon-api/src/main/java/com/mashibing/api/controller/SmsController.java
+++ b/beacon-api/src/main/java/com/mashibing/api/controller/SmsController.java
@@ -1,10 +1,14 @@
package com.mashibing.api.controller;
+import com.alibaba.cloud.commons.lang.StringUtils;
import com.mashibing.api.enums.SmsCodeEnum;
import com.mashibing.api.form.SingleSendForm;
import com.mashibing.api.util.R;
import com.mashibing.api.vo.ResultVO;
+import com.mashibing.common.model.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
@@ -12,24 +16,153 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import javax.servlet.http.HttpServletRequest;
+
/**
* @author dch
* @create 2024-03-18 23:40
*/
@RestController
@RequestMapping("/sms")
+@RefreshScope
@Slf4j
public class SmsController {
+ /**
+ * 客户端IP地址的请求头信息,多个用','隔开。
+ */
+ @Value("${headers}")
+ private String headers;
+
+ /**
+ * 基于请求头获取信息时,可能获取到的未知信息
+ */
+ private final String UNKNOW = "unknow";
+
+ /**
+ * 如果是当前请求头获取IP地址,需要截取到第一个','未知
+ */
+ private final String X_FORWARDED_FOR = "x-forwarded-for";
+
+ private final String HEADERHOST = "host";
+
- @PostMapping(value = "/single_send",produces = "application/json;charset=utf-8")
- public ResultVO singleSend(@RequestBody @Validated SingleSendForm singleSendForm, BindingResult bindingResult){
+ @PostMapping(value = "/single_send", produces = "application/json;charset=utf-8")
+ public ResultVO singleSend(@RequestBody @Validated SingleSendForm singleSendForm, BindingResult bindingResult, HttpServletRequest req) {
//1. 校验参数
if (bindingResult.hasErrors()){
String msg = bindingResult.getFieldError().getDefaultMessage();
log.info("【接口模块-单条短信Controller】 参数不合法 msg = {}",msg);
return R.error(SmsCodeEnum.PARAMETER_ERROR.getCode(),msg);
}
- //封装校验,构建submitcommon;发给mq,交给策略模块处理
- return R.ok(); }
+ //=========================获取真实的IP地址=========================================
+ String ip = this.getRealIP(req);
+
+ //=========================构建StandardSubmit,各种封装校验=========================================
+ StandardSubmit submit = new StandardSubmit();
+ submit.setRealIP(ip);
+ submit.setApikey(singleSendForm.getApikey());
+ submit.setMobile(singleSendForm.getMobile());
+ submit.setText(singleSendForm.getText());
+ submit.setState(singleSendForm.getState());
+ submit.setUid(singleSendForm.getUid());
+
+ //=========================发送到MQ,交给策略模块处理=========================================
+ return R.ok();
+ }
+
+ /**
+ * 获取客户端真实的IP地址
+ *
+ * @param req
+ * @return
+ */
+ private String getRealIP(HttpServletRequest req) {
+
+ //1. 声明返回的ip地址
+ String ip;
+
+ //2. 遍历请求头,并且通过req获取ip地址
+ for (String header : headers.split(",")) {
+ // 健壮性校验
+ if (!StringUtils.isEmpty(header)) {
+ // 基于req获取ip地址
+ ip = req.getHeader(header);
+ // 如果获取到的ip不为null,不为空串,并且不为unknow,就可以返回
+ if (!StringUtils.isEmpty(ip) && !UNKNOW.equalsIgnoreCase(ip)) {
+
+ // 判断请求头是否是host
+ if (HEADERHOST.equalsIgnoreCase(header)) {
+ ip = ip.contains(":") ? ip.substring(0, ip.indexOf(":")) : ip;
+ }
+
+
+ // 判断请求头是否是x-forwarded-for
+ if (X_FORWARDED_FOR.equalsIgnoreCase(header) && ip.indexOf(",") > 0) {
+ ip = ip.substring(0,ip.indexOf(","));
+ }
+ // 返回IP地址
+ return ip;
+ }
+ }
+ }
+
+ //3. 如果请求头都没有获取到IP地址,直接基于传统的方式获取一个IP
+ return req.getRemoteAddr();
+
+
+
+
+
+ /*
+ //0. 声明真实IP地址
+ String ip;
+
+ //虚拟机取host
+ ip = req.getHeader("host");
+ if (StringUtils.isNotEmpty(ip))
+ return ip.contains(":") ? ip.substring(0, ip.indexOf(":")) : ip;
+
+
+ //1. 基于x-forwarded-for请求头获取IP地址
+ String ips = req.getHeader("x-forwarded-for");
+ // 直接基于第一个,的位置,截取需要的IP地址
+ if (StringUtils.isNotEmpty(ips)) {
+ if (ips.contains(",")) {
+ return ips.substring(0, ips.indexOf(","));
+ } else {
+ return ips;
+ }
+ }
+
+ // 2. 基于请求头获取IP地址,基于request请求头获取信息时,除了null和空串外,还有可能拿到unknow,
+ ip = req.getHeader("x-real-ip");
+ if (StringUtils.isEmpty(ip) || "unknow".equalsIgnoreCase(ip)) {
+ // x-real-ip没拿到,考虑一下其他的代理服务器
+ //3. Apache的服务器,请求头中携带真实IP的名称是 proxy-client-ip
+ ip = req.getHeader("proxy-client-ip");
+ }
+
+ //4. 如果real没有拿到,判断apache是否拿到了。
+ if (StringUtils.isEmpty(ip) || "unknow".equalsIgnoreCase(ip)) {
+ // 5. 如果Apache服务器没拿到,考虑一手WebLogic, wl-proxy-client-ip
+ ip = req.getHeader("wl-proxy-client-ip");
+ }
+
+ //6. 判断WebLogic有木有拿到IP
+ if (StringUtils.isEmpty(ip) || "unknow".equalsIgnoreCase(ip)) {
+ //7. 基于其他的代理服务器的方式获取请求头的IP地址
+ ip = req.getHeader("http_client_ip");
+ }
+ //8. 如果上诉方式都获取不到,
+ if (StringUtils.isEmpty(ip) || "unknow".equalsIgnoreCase(ip)) {
+ // 9. 基于传统方式获取IP
+ ip = req.getRemoteAddr();
+ }
+ //10. 返回
+ return ip;*/
+
+
+ }
+
}
\ No newline at end of file
diff --git a/beacon-api/target/classes/com/mashibing/api/controller/SmsController.class b/beacon-api/target/classes/com/mashibing/api/controller/SmsController.class
index 9fdddf8..497e668 100644
Binary files a/beacon-api/target/classes/com/mashibing/api/controller/SmsController.class and b/beacon-api/target/classes/com/mashibing/api/controller/SmsController.class differ
diff --git a/beacon-cache/pom.xml b/beacon-cache/pom.xml
index 2f8f85e..f9b5d33 100644
--- a/beacon-cache/pom.xml
+++ b/beacon-cache/pom.xml
@@ -2,15 +2,21 @@
+ 4.0.0
- beacon-cloud
com.mashibing
+ beacon-cloud
1.0-SNAPSHOT
- 4.0.0
beacon-cache
+
+ 8
+ 8
+ UTF-8
+
+
@@ -28,10 +34,19 @@
spring-cloud-starter-alibaba-nacos-config
+
+
+
+ com.msb.cloud
+ horse-framework-starter-redis
+ 1.0.0
+
-
+
+
\ No newline at end of file
diff --git a/beacon-cache/src/main/java/com/mashibing/cache/CacheStarterApp.java b/beacon-cache/src/main/java/com/mashibing/cache/CacheStarterApp.java
index a647be4..b129831 100644
--- a/beacon-cache/src/main/java/com/mashibing/cache/CacheStarterApp.java
+++ b/beacon-cache/src/main/java/com/mashibing/cache/CacheStarterApp.java
@@ -6,7 +6,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author dch
- * @create 2024-03-19 14:34
+ * @create 2024-03-19 20:00
*/
@SpringBootApplication
@EnableDiscoveryClient
@@ -16,4 +16,4 @@ public class CacheStarterApp {
SpringApplication.run(CacheStarterApp.class,args);
}
-}
+}
\ No newline at end of file
diff --git a/beacon-cache/src/main/java/com/mashibing/cache/config/RedisConfig.java b/beacon-cache/src/main/java/com/mashibing/cache/config/RedisConfig.java
index 91436e3..80a136c 100644
--- a/beacon-cache/src/main/java/com/mashibing/cache/config/RedisConfig.java
+++ b/beacon-cache/src/main/java/com/mashibing/cache/config/RedisConfig.java
@@ -19,15 +19,17 @@ import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
- * 设置RedisTemplate的序列化方式
- * @author dch
- * @create 2024-03-19 11:31
+ * 设置RedisTemplate的序列化方式
+ * @author zjw
+ * @description
*/
+/*
+
@Configuration
public class RedisConfig {
@Bean
- public RedisTemplate redisTemplate(RedisConnectionFactory factory, RedisSerializer