初始化
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
package com.njcn.gateway.utils;
|
||||
|
||||
import com.njcn.common.pojo.response.HttpResult;
|
||||
import com.njcn.common.utils.HttpResultUtil;
|
||||
import com.njcn.gateway.enums.GateWayEnum;
|
||||
|
||||
/**
|
||||
* @author hongawen
|
||||
* @version 1.0.0
|
||||
* @date 2021年06月04日 11:22
|
||||
*/
|
||||
public class GatePubUtils {
|
||||
|
||||
/**
|
||||
* 通用结果集
|
||||
*/
|
||||
public static <T> HttpResult<T> assembleGateWayResponseResult(GateWayEnum responseEnum, T result, String methodDescribe) {
|
||||
return HttpResultUtil.assembleResult(responseEnum.getCode(), result, methodDescribe + responseEnum.getMessage());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package com.njcn.gateway.utils;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* @author hongawen
|
||||
* @version 1.0.0
|
||||
* @date 2021年05月25日 11:25
|
||||
*/
|
||||
@Slf4j
|
||||
public class IpUtils {
|
||||
|
||||
|
||||
private static final String UNKNOWN = "unknown";
|
||||
private static final String LOCALHOST_IPV4 = "127.0.0.1";
|
||||
private static final String LOCALHOST_IPV6 = "0:0:0:0:0:0:0:1";
|
||||
private static final String SEPARATOR = ",";
|
||||
|
||||
private static final String HEADER_X_FORWARDED_FOR = "x-forwarded-for";
|
||||
private static final String HEADER_PROXY_CLIENT_IP = "Proxy-Client-IP";
|
||||
private static final String HEADER_WL_PROXY_CLIENT_IP = "WL-Proxy-Client-IP";
|
||||
|
||||
private static final int IP_LEN = 15;
|
||||
|
||||
/**
|
||||
* 获取用户真实IP地址,不直接使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址,
|
||||
* <p>
|
||||
* 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?
|
||||
* 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。
|
||||
* <p>
|
||||
* 如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130,
|
||||
* 192.168.1.100
|
||||
* <p>
|
||||
* 用户真实IP为: 192.168.1.110
|
||||
*/
|
||||
public static String getRealIpAddress(ServerHttpRequest request) {
|
||||
HttpHeaders headers = request.getHeaders();
|
||||
String ipAddress = headers.getFirst(HEADER_X_FORWARDED_FOR);
|
||||
if (StrUtil.isBlankIfStr(ipAddress) || UNKNOWN.equalsIgnoreCase(ipAddress)) {
|
||||
ipAddress = headers.getFirst(HEADER_PROXY_CLIENT_IP);
|
||||
}
|
||||
if (StrUtil.isBlankIfStr(ipAddress) || UNKNOWN.equalsIgnoreCase(ipAddress)) {
|
||||
ipAddress = headers.getFirst(HEADER_WL_PROXY_CLIENT_IP);
|
||||
}
|
||||
if (StrUtil.isBlankIfStr(ipAddress) || UNKNOWN.equalsIgnoreCase(ipAddress)) {
|
||||
ipAddress = Optional.ofNullable(request.getRemoteAddress())
|
||||
.map(address -> address.getAddress().getHostAddress())
|
||||
.orElse("");
|
||||
if (LOCALHOST_IPV4.equals(ipAddress) || LOCALHOST_IPV6.equals(ipAddress)) {
|
||||
// 根据网卡取本机配置的IP
|
||||
try {
|
||||
InetAddress inet = InetAddress.getLocalHost();
|
||||
ipAddress = inet.getHostAddress();
|
||||
} catch (UnknownHostException e) {
|
||||
log.error("解析请求IP失败,{}", Stream.of(e.getStackTrace()).map(StackTraceElement::toString).collect(Collectors.joining(StrUtil.CRLF)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
|
||||
if (ipAddress != null && ipAddress.length() > IP_LEN) {
|
||||
int index = ipAddress.indexOf(SEPARATOR);
|
||||
if (index > 0) {
|
||||
ipAddress = ipAddress.substring(0, index);
|
||||
}
|
||||
}
|
||||
return ipAddress;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取客户端端口
|
||||
*/
|
||||
public static Integer getPort(ServerHttpRequest request) {
|
||||
return request.getRemoteAddress().getPort();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.njcn.gateway.utils;
|
||||
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.alibaba.csp.sentinel.util.StringUtil;
|
||||
import com.njcn.common.pojo.response.HttpResult;
|
||||
import com.njcn.common.utils.HttpResultUtil;
|
||||
import com.njcn.gateway.enums.GateWayEnum;
|
||||
import org.springframework.core.io.buffer.DataBuffer;
|
||||
import org.springframework.core.io.buffer.DataBufferUtils;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/**
|
||||
* @author hongawen
|
||||
* @version 1.0.0
|
||||
* @date 2021年12月16日 10:26
|
||||
*/
|
||||
public class ResponseUtils {
|
||||
|
||||
public static Mono<Void> writeErrorInfo(ServerHttpResponse response, GateWayEnum gateWayEnum) {
|
||||
// switch (gateWayEnum) {
|
||||
// case NO_AUTHORIZATION:
|
||||
// case PARSE_TOKEN_EXPIRE_JWT:
|
||||
// response.setStatusCode(HttpStatus.OK);
|
||||
// break;
|
||||
// case PARSE_TOKEN_FORBIDDEN_JWT:
|
||||
// response.setStatusCode(HttpStatus.FORBIDDEN);
|
||||
// break;
|
||||
// default:
|
||||
// response.setStatusCode(HttpStatus.BAD_REQUEST);
|
||||
// break;
|
||||
// }
|
||||
response.setStatusCode(HttpStatus.OK);
|
||||
response.getHeaders().set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
|
||||
response.getHeaders().set("Access-Control-Allow-Origin", "*");
|
||||
response.getHeaders().set("Cache-Control", "no-cache");
|
||||
String body = JSONUtil.toJsonStr(
|
||||
HttpResultUtil.assembleResult(gateWayEnum.getCode(), null, StringUtil.EMPTY + gateWayEnum.getMessage())
|
||||
);
|
||||
DataBuffer buffer = response.bufferFactory().wrap(body.getBytes(StandardCharsets.UTF_8));
|
||||
return response.writeWith(Mono.just(buffer))
|
||||
.doOnError(error -> DataBufferUtils.release(buffer));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user