mirror of
https://gitee.com/durcframework/SOP.git
synced 2025-08-12 07:02:14 +08:00
2.5.10
This commit is contained in:
@@ -1,5 +1,9 @@
|
|||||||
# changelog
|
# changelog
|
||||||
|
|
||||||
|
## 2.5.10
|
||||||
|
|
||||||
|
- 优化签名认证,优化校验日志打印
|
||||||
|
|
||||||
## 2.5.9
|
## 2.5.9
|
||||||
|
|
||||||
- 优化获取context-path
|
- 优化获取context-path
|
||||||
|
@@ -26,7 +26,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.gitee.sop</groupId>
|
<groupId>com.gitee.sop</groupId>
|
||||||
<artifactId>sop-service-common</artifactId>
|
<artifactId>sop-service-common</artifactId>
|
||||||
<version>2.5.9-SNAPSHOT</version>
|
<version>2.5.10-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- sop相关配置 end-->
|
<!-- sop相关配置 end-->
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.gitee.sop</groupId>
|
<groupId>com.gitee.sop</groupId>
|
||||||
<artifactId>sop-common</artifactId>
|
<artifactId>sop-common</artifactId>
|
||||||
<version>2.5.9-SNAPSHOT</version>
|
<version>2.5.10-SNAPSHOT</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
@@ -5,11 +5,11 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.gitee.sop</groupId>
|
<groupId>com.gitee.sop</groupId>
|
||||||
<artifactId>sop-common</artifactId>
|
<artifactId>sop-common</artifactId>
|
||||||
<version>2.5.9-SNAPSHOT</version>
|
<version>2.5.10-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>sop-gateway-common</artifactId>
|
<artifactId>sop-gateway-common</artifactId>
|
||||||
<version>2.5.9-SNAPSHOT</version>
|
<version>2.5.10-SNAPSHOT</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>sop-gateway-common</name>
|
<name>sop-gateway-common</name>
|
||||||
|
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
|
|||||||
import com.gitee.sop.gatewaycommon.bean.SopConstants;
|
import com.gitee.sop.gatewaycommon.bean.SopConstants;
|
||||||
import com.gitee.sop.gatewaycommon.param.ApiUploadContext;
|
import com.gitee.sop.gatewaycommon.param.ApiUploadContext;
|
||||||
import com.gitee.sop.gatewaycommon.param.UploadContext;
|
import com.gitee.sop.gatewaycommon.param.UploadContext;
|
||||||
|
import com.gitee.sop.gatewaycommon.zuul.param.ZuulParameterUtil;
|
||||||
import com.netflix.zuul.http.HttpServletRequestWrapper;
|
import com.netflix.zuul.http.HttpServletRequestWrapper;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
@@ -14,8 +15,11 @@ import org.apache.commons.io.IOUtils;
|
|||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
import org.springframework.web.multipart.commons.CommonsMultipartFile;
|
import org.springframework.web.multipart.commons.CommonsMultipartFile;
|
||||||
|
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -24,6 +28,7 @@ import java.net.InetAddress;
|
|||||||
import java.net.URLDecoder;
|
import java.net.URLDecoder;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -240,6 +245,9 @@ public class RequestUtil {
|
|||||||
* @return 返回文件内容和表单内容
|
* @return 返回文件内容和表单内容
|
||||||
*/
|
*/
|
||||||
public static UploadInfo getUploadInfo(HttpServletRequest request) {
|
public static UploadInfo getUploadInfo(HttpServletRequest request) {
|
||||||
|
if (request instanceof StandardMultipartHttpServletRequest) {
|
||||||
|
return getUploadInfo((StandardMultipartHttpServletRequest)request);
|
||||||
|
}
|
||||||
UploadInfo uploadInfo = new UploadInfo();
|
UploadInfo uploadInfo = new UploadInfo();
|
||||||
// 创建一个文件上传解析器
|
// 创建一个文件上传解析器
|
||||||
ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
|
ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
|
||||||
@@ -269,6 +277,19 @@ public class RequestUtil {
|
|||||||
return uploadInfo;
|
return uploadInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static UploadInfo getUploadInfo(StandardMultipartHttpServletRequest request) {
|
||||||
|
UploadInfo uploadInfo = new UploadInfo();
|
||||||
|
Map<String, String> uploadParams = new HashMap<>(16);
|
||||||
|
request.getParameterMap().forEach((key, value)-> uploadParams.put(key, value[0]));
|
||||||
|
|
||||||
|
Map<String, MultipartFile> multipartFileMap = request.getMultiFileMap().toSingleValueMap();
|
||||||
|
UploadContext uploadContext = new ApiUploadContext(multipartFileMap);
|
||||||
|
|
||||||
|
uploadInfo.setUploadParams(uploadParams);
|
||||||
|
uploadInfo.setUploadContext(uploadContext);
|
||||||
|
return uploadInfo;
|
||||||
|
}
|
||||||
|
|
||||||
public static void checkResponseBody(String responseBody, String sign, String secret) throws Exception {
|
public static void checkResponseBody(String responseBody, String sign, String secret) throws Exception {
|
||||||
if (sign == null) {
|
if (sign == null) {
|
||||||
throw new Exception("签名不存在");
|
throw new Exception("签名不存在");
|
||||||
@@ -280,6 +301,26 @@ public class RequestUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static HttpServletRequest wrapRequest(HttpServletRequest request) {
|
||||||
|
if (request.getMethod().equalsIgnoreCase(HttpMethod.GET.name()) ||
|
||||||
|
request instanceof StandardMultipartHttpServletRequest) {
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
HttpServletRequest wrapper = request;
|
||||||
|
String contentType = request.getContentType();
|
||||||
|
MediaType mediaType = MediaType.valueOf(contentType);
|
||||||
|
if (MediaType.APPLICATION_JSON.includes(mediaType)) {
|
||||||
|
try {
|
||||||
|
String json = RequestUtil.getText(request);
|
||||||
|
byte[] data = json.getBytes(StandardCharsets.UTF_8);
|
||||||
|
wrapper = new ZuulParameterUtil.BodyDataHttpServletRequestWrapper(request, data);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("wrapRequest异常", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return wrapper;
|
||||||
|
}
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public static class UploadInfo {
|
public static class UploadInfo {
|
||||||
private Map<String, String> uploadParams;
|
private Map<String, String> uploadParams;
|
||||||
|
@@ -30,7 +30,7 @@ public class ResponseUtil {
|
|||||||
response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
|
response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
|
||||||
response.setCharacterEncoding(UTF_8);
|
response.setCharacterEncoding(UTF_8);
|
||||||
try {
|
try {
|
||||||
response.getWriter().write(JSON.toJSONString(result));
|
response.getWriter().write(result instanceof String ? (String)result : JSON.toJSONString(result));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
log.error("doWriter", e);
|
log.error("doWriter", e);
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,90 @@
|
|||||||
|
package com.gitee.sop.gatewaycommon.zuul;
|
||||||
|
|
||||||
|
import com.gitee.sop.gatewaycommon.bean.ApiConfig;
|
||||||
|
import com.gitee.sop.gatewaycommon.param.ApiParam;
|
||||||
|
import com.gitee.sop.gatewaycommon.param.ParamBuilder;
|
||||||
|
import com.gitee.sop.gatewaycommon.util.RequestUtil;
|
||||||
|
import com.gitee.sop.gatewaycommon.util.ResponseUtil;
|
||||||
|
import com.gitee.sop.gatewaycommon.validate.Validator;
|
||||||
|
import com.netflix.zuul.context.RequestContext;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 负责签名校验
|
||||||
|
* @author tanghc
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class ValidateService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ParamBuilder<RequestContext> paramBuilder;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Validator validator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验操作
|
||||||
|
*
|
||||||
|
* @param request request
|
||||||
|
* @param response response
|
||||||
|
* @param callback 校验后操作
|
||||||
|
*/
|
||||||
|
public void validate(HttpServletRequest request, HttpServletResponse response, ValidateCallback callback) {
|
||||||
|
RequestContext currentContext = RequestContext.getCurrentContext();
|
||||||
|
currentContext.setRequest(RequestUtil.wrapRequest(request));
|
||||||
|
currentContext.setResponse(response);
|
||||||
|
doValidate(currentContext, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 签名校验
|
||||||
|
*
|
||||||
|
* @param currentContext currentContext
|
||||||
|
*/
|
||||||
|
private void doValidate(RequestContext currentContext, ValidateCallback callback) {
|
||||||
|
// 解析参数
|
||||||
|
ApiParam param = paramBuilder.build(currentContext);
|
||||||
|
ZuulContext.setApiParam(param);
|
||||||
|
Exception error = null;
|
||||||
|
// 验证操作,这里有负责验证签名参数
|
||||||
|
try {
|
||||||
|
validator.validate(param);
|
||||||
|
} catch (Exception e) {
|
||||||
|
error = e;
|
||||||
|
}
|
||||||
|
param.fitNameVersion();
|
||||||
|
if (error == null) {
|
||||||
|
callback.onSuccess(currentContext);
|
||||||
|
} else {
|
||||||
|
callback.onError(currentContext, param, error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public interface ValidateCallback {
|
||||||
|
/**
|
||||||
|
* 校验成功触发
|
||||||
|
*
|
||||||
|
* @param currentContext 上下文
|
||||||
|
*/
|
||||||
|
void onSuccess(RequestContext currentContext);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验失败触发
|
||||||
|
*
|
||||||
|
* @param currentContext 上下文
|
||||||
|
* @param param 参数
|
||||||
|
* @param throwable 异常
|
||||||
|
*/
|
||||||
|
default void onError(RequestContext currentContext, ApiParam param, Throwable throwable) {
|
||||||
|
log.error("验证失败,ip:{}, params:{}, errorMsg:{}", param.fetchIp(), param.toJSONString(), throwable.getMessage());
|
||||||
|
String errorResult = ApiConfig.getInstance().getZuulResultExecutor().buildErrorResult(currentContext, throwable);
|
||||||
|
ResponseUtil.writeJson(currentContext.getResponse(), errorResult);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -5,6 +5,7 @@ import com.gitee.sop.gatewaycommon.bean.ApiContext;
|
|||||||
import com.gitee.sop.gatewaycommon.manager.AbstractConfiguration;
|
import com.gitee.sop.gatewaycommon.manager.AbstractConfiguration;
|
||||||
import com.gitee.sop.gatewaycommon.manager.RouteRepositoryContext;
|
import com.gitee.sop.gatewaycommon.manager.RouteRepositoryContext;
|
||||||
import com.gitee.sop.gatewaycommon.param.ParamBuilder;
|
import com.gitee.sop.gatewaycommon.param.ParamBuilder;
|
||||||
|
import com.gitee.sop.gatewaycommon.zuul.ValidateService;
|
||||||
import com.gitee.sop.gatewaycommon.zuul.filter.ErrorFilter;
|
import com.gitee.sop.gatewaycommon.zuul.filter.ErrorFilter;
|
||||||
import com.gitee.sop.gatewaycommon.zuul.filter.FormBodyWrapperFilterExt;
|
import com.gitee.sop.gatewaycommon.zuul.filter.FormBodyWrapperFilterExt;
|
||||||
import com.gitee.sop.gatewaycommon.zuul.filter.PostResultFilter;
|
import com.gitee.sop.gatewaycommon.zuul.filter.PostResultFilter;
|
||||||
@@ -54,6 +55,7 @@ public class BaseZuulConfiguration extends AbstractConfiguration {
|
|||||||
return zuulRouteRepository;
|
return zuulRouteRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
PreHttpServletRequestWrapperFilter preHttpServletRequestWrapperFilter() {
|
PreHttpServletRequestWrapperFilter preHttpServletRequestWrapperFilter() {
|
||||||
return new PreHttpServletRequestWrapperFilter();
|
return new PreHttpServletRequestWrapperFilter();
|
||||||
@@ -102,6 +104,11 @@ public class BaseZuulConfiguration extends AbstractConfiguration {
|
|||||||
return new PreValidateFilter();
|
return new PreValidateFilter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
ValidateService validateService() {
|
||||||
|
return new ValidateService();
|
||||||
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
PreParameterFormatterFilter preParameterFormatterFilter() {
|
PreParameterFormatterFilter preParameterFormatterFilter() {
|
||||||
return new PreParameterFormatterFilter();
|
return new PreParameterFormatterFilter();
|
||||||
|
@@ -1,16 +1,15 @@
|
|||||||
package com.gitee.sop.gatewaycommon.zuul.filter;
|
package com.gitee.sop.gatewaycommon.zuul.filter;
|
||||||
|
|
||||||
import com.gitee.sop.gatewaycommon.exception.ApiException;
|
|
||||||
import com.gitee.sop.gatewaycommon.param.ApiParam;
|
import com.gitee.sop.gatewaycommon.param.ApiParam;
|
||||||
import com.gitee.sop.gatewaycommon.param.ParamBuilder;
|
import com.gitee.sop.gatewaycommon.param.ParamBuilder;
|
||||||
import com.gitee.sop.gatewaycommon.validate.Validator;
|
|
||||||
import com.gitee.sop.gatewaycommon.zuul.ZuulContext;
|
import com.gitee.sop.gatewaycommon.zuul.ZuulContext;
|
||||||
import com.netflix.zuul.context.RequestContext;
|
import com.netflix.zuul.context.RequestContext;
|
||||||
import com.netflix.zuul.exception.ZuulException;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 前置校验
|
* 校验工作转移到了 com.gitee.sop.gateway.controller.RedirectController
|
||||||
|
*
|
||||||
|
* 将校验工作提前,如果在zuul过滤器中校验,抛出异常将会打印非常多的日志,并且无法实现自定义返回结果。
|
||||||
*
|
*
|
||||||
* @author tanghc
|
* @author tanghc
|
||||||
*/
|
*/
|
||||||
@@ -19,9 +18,6 @@ public class PreValidateFilter extends BaseZuulFilter {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private ParamBuilder<RequestContext> paramBuilder;
|
private ParamBuilder<RequestContext> paramBuilder;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private Validator validator;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected FilterType getFilterType() {
|
protected FilterType getFilterType() {
|
||||||
return FilterType.PRE;
|
return FilterType.PRE;
|
||||||
@@ -33,18 +29,11 @@ public class PreValidateFilter extends BaseZuulFilter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Object doRun(RequestContext requestContext) throws ZuulException {
|
protected Object doRun(RequestContext requestContext) {
|
||||||
// 解析参数
|
ApiParam param = ZuulContext.getApiParam();
|
||||||
ApiParam param = paramBuilder.build(requestContext);
|
if (param == null) {
|
||||||
ZuulContext.setApiParam(param);
|
param = paramBuilder.build(requestContext);
|
||||||
// 验证操作,这里有负责验证签名参数
|
ZuulContext.setApiParam(param);
|
||||||
try {
|
|
||||||
validator.validate(param);
|
|
||||||
} catch (ApiException e) {
|
|
||||||
log.error("验证失败,ip:{}, params:{}", param.fetchIp(), param.toJSONString(), e);
|
|
||||||
throw e;
|
|
||||||
} finally {
|
|
||||||
param.fitNameVersion();
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@@ -53,11 +53,11 @@ public class ZuulParameterUtil {
|
|||||||
((JSONObject) apiParam).toJSONString()
|
((JSONObject) apiParam).toJSONString()
|
||||||
: JSON.toJSONString(apiParam);
|
: JSON.toJSONString(apiParam);
|
||||||
byte[] bytes = json.getBytes(StandardCharsets.UTF_8);
|
byte[] bytes = json.getBytes(StandardCharsets.UTF_8);
|
||||||
requestContext.setRequest(new ChangeParamsHttpServletRequestWrapper(request, bytes));
|
requestContext.setRequest(new BodyDataHttpServletRequestWrapper(request, bytes));
|
||||||
} else if(StringUtils.containsIgnoreCase(contentType, MediaType.APPLICATION_FORM_URLENCODED_VALUE)) {
|
} else if(StringUtils.containsIgnoreCase(contentType, MediaType.APPLICATION_FORM_URLENCODED_VALUE)) {
|
||||||
String paramsStr = RequestUtil.convertMapToQueryString(apiParam);
|
String paramsStr = RequestUtil.convertMapToQueryString(apiParam);
|
||||||
byte[] data = paramsStr.getBytes(StandardCharsets.UTF_8);
|
byte[] data = paramsStr.getBytes(StandardCharsets.UTF_8);
|
||||||
requestContext.setRequest(new ChangeParamsHttpServletRequestWrapper(request, data));
|
requestContext.setRequest(new BodyDataHttpServletRequestWrapper(request, data));
|
||||||
} else if(RequestUtil.isMultipart(request)) {
|
} else if(RequestUtil.isMultipart(request)) {
|
||||||
FormHttpOutputMessage outputMessage = new FormHttpOutputMessage();
|
FormHttpOutputMessage outputMessage = new FormHttpOutputMessage();
|
||||||
try {
|
try {
|
||||||
@@ -82,7 +82,7 @@ public class ZuulParameterUtil {
|
|||||||
// 获取新的上传文件流
|
// 获取新的上传文件流
|
||||||
byte[] data = outputMessage.getInput();
|
byte[] data = outputMessage.getInput();
|
||||||
|
|
||||||
requestContext.setRequest(new ChangeParamsHttpServletRequestWrapper(request, data));
|
requestContext.setRequest(new BodyDataHttpServletRequestWrapper(request, data));
|
||||||
// 必须要重新指定content-type,因为此时的boundary已经发生改变
|
// 必须要重新指定content-type,因为此时的boundary已经发生改变
|
||||||
requestContext.getZuulRequestHeaders().put("content-type", outputMessage.getHeaders().getContentType().toString());
|
requestContext.getZuulRequestHeaders().put("content-type", outputMessage.getHeaders().getContentType().toString());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -103,10 +103,10 @@ public class ZuulParameterUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class ChangeParamsHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
public static class BodyDataHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
||||||
private byte[] data;
|
private byte[] data;
|
||||||
|
|
||||||
public ChangeParamsHttpServletRequestWrapper(HttpServletRequest request, byte[] data) {
|
public BodyDataHttpServletRequestWrapper(HttpServletRequest request, byte[] data) {
|
||||||
super(request);
|
super(request);
|
||||||
this.data = data;
|
this.data = data;
|
||||||
}
|
}
|
||||||
|
@@ -73,6 +73,9 @@ public class ZuulResultExecutor extends BaseExecutorAdapter<RequestContext, Stri
|
|||||||
ApiException apiException = (ApiException) cause;
|
ApiException apiException = (ApiException) cause;
|
||||||
error = apiException.getError();
|
error = apiException.getError();
|
||||||
}
|
}
|
||||||
|
} else if (throwable instanceof ApiException) {
|
||||||
|
ApiException apiException = (ApiException) throwable;
|
||||||
|
error = apiException.getError();
|
||||||
}
|
}
|
||||||
if (error == null) {
|
if (error == null) {
|
||||||
error = ErrorEnum.ISP_UNKNOWN_ERROR.getErrorMeta().getError();
|
error = ErrorEnum.ISP_UNKNOWN_ERROR.getErrorMeta().getError();
|
||||||
|
@@ -6,11 +6,11 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.gitee.sop</groupId>
|
<groupId>com.gitee.sop</groupId>
|
||||||
<artifactId>sop-common</artifactId>
|
<artifactId>sop-common</artifactId>
|
||||||
<version>2.5.9-SNAPSHOT</version>
|
<version>2.5.10-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>sop-service-common</artifactId>
|
<artifactId>sop-service-common</artifactId>
|
||||||
<version>2.5.9-SNAPSHOT</version>
|
<version>2.5.10-SNAPSHOT</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>sop-service-common</name>
|
<name>sop-service-common</name>
|
||||||
|
@@ -28,7 +28,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.gitee.sop</groupId>
|
<groupId>com.gitee.sop</groupId>
|
||||||
<artifactId>sop-service-common</artifactId>
|
<artifactId>sop-service-common</artifactId>
|
||||||
<version>2.5.9-SNAPSHOT</version>
|
<version>2.5.10-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.gitee.sop</groupId>
|
<groupId>com.gitee.sop</groupId>
|
||||||
|
@@ -29,7 +29,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.gitee.sop</groupId>
|
<groupId>com.gitee.sop</groupId>
|
||||||
<artifactId>sop-service-common</artifactId>
|
<artifactId>sop-service-common</artifactId>
|
||||||
<version>2.5.9-SNAPSHOT</version>
|
<version>2.5.10-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 使用nacos注册中心
|
<!-- 使用nacos注册中心
|
||||||
|
@@ -20,7 +20,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.gitee.sop</groupId>
|
<groupId>com.gitee.sop</groupId>
|
||||||
<artifactId>sop-service-common</artifactId>
|
<artifactId>sop-service-common</artifactId>
|
||||||
<version>2.5.9-SNAPSHOT</version>
|
<version>2.5.10-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- nacos -->
|
<!-- nacos -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@@ -28,7 +28,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.gitee.sop</groupId>
|
<groupId>com.gitee.sop</groupId>
|
||||||
<artifactId>sop-service-common</artifactId>
|
<artifactId>sop-service-common</artifactId>
|
||||||
<version>2.5.9-SNAPSHOT</version>
|
<version>2.5.10-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.gitee.sop</groupId>
|
<groupId>com.gitee.sop</groupId>
|
||||||
|
@@ -29,7 +29,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.gitee.sop</groupId>
|
<groupId>com.gitee.sop</groupId>
|
||||||
<artifactId>sop-gateway-common</artifactId>
|
<artifactId>sop-gateway-common</artifactId>
|
||||||
<version>2.5.9-SNAPSHOT</version>
|
<version>2.5.10-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- ↓↓↓ 使用spring cloud zuul ↓↓↓ -->
|
<!-- ↓↓↓ 使用spring cloud zuul ↓↓↓ -->
|
||||||
|
@@ -1,43 +1,66 @@
|
|||||||
package com.gitee.sop.gateway.controller;
|
package com.gitee.sop.gateway.controller;
|
||||||
|
|
||||||
import com.gitee.sop.gatewaycommon.bean.SopConstants;
|
import com.gitee.sop.gatewaycommon.bean.SopConstants;
|
||||||
|
import com.gitee.sop.gatewaycommon.zuul.ValidateService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
|
||||||
import javax.servlet.ServletException;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* 网关入口
|
||||||
|
*
|
||||||
* @author tanghc
|
* @author tanghc
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@Controller
|
@Controller
|
||||||
public class RedirectController {
|
public class RedirectController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ValidateService validateService;
|
||||||
|
|
||||||
@Value("${zuul.servlet-path:/zuul}")
|
@Value("${zuul.servlet-path:/zuul}")
|
||||||
private String path;
|
private String path;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证回调,可自定义实现接口
|
||||||
|
*/
|
||||||
|
private ValidateService.ValidateCallback callback = (currentContext -> {
|
||||||
|
try {
|
||||||
|
currentContext.getRequest().getRequestDispatcher(path).forward(currentContext.getRequest(), currentContext.getResponse());
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("请求转发异常", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网关入口
|
||||||
|
*
|
||||||
|
* @param request request
|
||||||
|
* @param response response
|
||||||
|
*/
|
||||||
|
@RequestMapping("/")
|
||||||
|
public void index(HttpServletRequest request, HttpServletResponse response) {
|
||||||
|
validateService.validate(request, response, callback);
|
||||||
|
}
|
||||||
|
|
||||||
@RequestMapping("/{method}/{version}/")
|
@RequestMapping("/{method}/{version}/")
|
||||||
public void redirect(
|
public void redirect(
|
||||||
@PathVariable("method") String method
|
@PathVariable("method") String method
|
||||||
, @PathVariable("version") String version
|
, @PathVariable("version") String version
|
||||||
, HttpServletRequest request
|
, HttpServletRequest request
|
||||||
, HttpServletResponse response
|
, HttpServletResponse response
|
||||||
) throws ServletException, IOException {
|
) {
|
||||||
request.setAttribute(SopConstants.REDIRECT_METHOD_KEY, method);
|
request.setAttribute(SopConstants.REDIRECT_METHOD_KEY, method);
|
||||||
request.setAttribute(SopConstants.REDIRECT_VERSION_KEY, version);
|
request.setAttribute(SopConstants.REDIRECT_VERSION_KEY, version);
|
||||||
request.getRequestDispatcher(path).forward(request, response);
|
validateService.validate(request, response, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping("/")
|
|
||||||
public void index(
|
|
||||||
HttpServletRequest request
|
|
||||||
, HttpServletResponse response
|
|
||||||
) throws ServletException, IOException {
|
|
||||||
request.getRequestDispatcher(path).forward(request, response);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +1,6 @@
|
|||||||
package com.gitee.sop.gateway.controller;
|
package com.gitee.sop.gateway.controller;
|
||||||
|
|
||||||
import com.gitee.sop.gatewaycommon.bean.SopConstants;
|
import com.gitee.sop.gatewaycommon.bean.SopConstants;
|
||||||
import com.gitee.sop.gatewaycommon.param.ParamNames;
|
|
||||||
import com.gitee.sop.gatewaycommon.util.RouteUtil;
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
|
@@ -18,7 +18,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
public class AllInOneTest extends TestBase {
|
public class AllInOneTest extends TestBase {
|
||||||
|
|
||||||
String url = "http://localhost:8081";
|
String url = "http://localhost:8081";
|
||||||
String appId = "2019032617262200001";
|
String appId = "2019032617262200001-";
|
||||||
String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCXJv1pQFqWNA/++OYEV7WYXwexZK/J8LY1OWlP9X0T6wHFOvxNKRvMkJ5544SbgsJpVcvRDPrcxmhPbi/sAhdO4x2PiPKIz9Yni2OtYCCeaiE056B+e1O2jXoLeXbfi9fPivJZkxH/tb4xfLkH3bA8ZAQnQsoXA0SguykMRZntF0TndUfvDrLqwhlR8r5iRdZLB6F8o8qXH6UPDfNEnf/K8wX5T4EB1b8x8QJ7Ua4GcIUqeUxGHdQpzNbJdaQvoi06lgccmL+PHzminkFYON7alj1CjDN833j7QMHdPtS9l7B67fOU/p2LAAkPMtoVBfxQt9aFj7B8rEhGCz02iJIBAgMBAAECggEARqOuIpY0v6WtJBfmR3lGIOOokLrhfJrGTLF8CiZMQha+SRJ7/wOLPlsH9SbjPlopyViTXCuYwbzn2tdABigkBHYXxpDV6CJZjzmRZ+FY3S/0POlTFElGojYUJ3CooWiVfyUMhdg5vSuOq0oCny53woFrf32zPHYGiKdvU5Djku1onbDU0Lw8w+5tguuEZ76kZ/lUcccGy5978FFmYpzY/65RHCpvLiLqYyWTtaNT1aQ/9pw4jX9HO9NfdJ9gYFK8r/2f36ZE4hxluAfeOXQfRC/WhPmiw/ReUhxPznG/WgKaa/OaRtAx3inbQ+JuCND7uuKeRe4osP2jLPHPP6AUwQKBgQDUNu3BkLoKaimjGOjCTAwtp71g1oo+k5/uEInAo7lyEwpV0EuUMwLA/HCqUgR4K9pyYV+Oyb8d6f0+Hz0BMD92I2pqlXrD7xV2WzDvyXM3s63NvorRooKcyfd9i6ccMjAyTR2qfLkxv0hlbBbsPHz4BbU63xhTJp3Ghi0/ey/1HQKBgQC2VsgqC6ykfSidZUNLmQZe3J0p/Qf9VLkfrQ+xaHapOs6AzDU2H2osuysqXTLJHsGfrwVaTs00ER2z8ljTJPBUtNtOLrwNRlvgdnzyVAKHfOgDBGwJgiwpeE9voB1oAV/mXqSaUWNnuwlOIhvQEBwekqNyWvhLqC7nCAIhj3yvNQKBgQCqYbeec56LAhWP903Zwcj9VvG7sESqXUhIkUqoOkuIBTWFFIm54QLTA1tJxDQGb98heoCIWf5x/A3xNI98RsqNBX5JON6qNWjb7/dobitti3t99v/ptDp9u8JTMC7penoryLKK0Ty3bkan95Kn9SC42YxaSghzqkt+uvfVQgiNGQKBgGxU6P2aDAt6VNwWosHSe+d2WWXt8IZBhO9d6dn0f7ORvcjmCqNKTNGgrkewMZEuVcliueJquR47IROdY8qmwqcBAN7Vg2K7r7CPlTKAWTRYMJxCT1Hi5gwJb+CZF3+IeYqsJk2NF2s0w5WJTE70k1BSvQsfIzAIDz2yE1oPHvwVAoGAA6e+xQkVH4fMEph55RJIZ5goI4Y76BSvt2N5OKZKd4HtaV+eIhM3SDsVYRLIm9ZquJHMiZQGyUGnsvrKL6AAVNK7eQZCRDk9KQz+0GKOGqku0nOZjUbAu6A2/vtXAaAuFSFx1rUQVVjFulLexkXR3KcztL1Qu2k5pB6Si0K/uwQ=";
|
String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCXJv1pQFqWNA/++OYEV7WYXwexZK/J8LY1OWlP9X0T6wHFOvxNKRvMkJ5544SbgsJpVcvRDPrcxmhPbi/sAhdO4x2PiPKIz9Yni2OtYCCeaiE056B+e1O2jXoLeXbfi9fPivJZkxH/tb4xfLkH3bA8ZAQnQsoXA0SguykMRZntF0TndUfvDrLqwhlR8r5iRdZLB6F8o8qXH6UPDfNEnf/K8wX5T4EB1b8x8QJ7Ua4GcIUqeUxGHdQpzNbJdaQvoi06lgccmL+PHzminkFYON7alj1CjDN833j7QMHdPtS9l7B67fOU/p2LAAkPMtoVBfxQt9aFj7B8rEhGCz02iJIBAgMBAAECggEARqOuIpY0v6WtJBfmR3lGIOOokLrhfJrGTLF8CiZMQha+SRJ7/wOLPlsH9SbjPlopyViTXCuYwbzn2tdABigkBHYXxpDV6CJZjzmRZ+FY3S/0POlTFElGojYUJ3CooWiVfyUMhdg5vSuOq0oCny53woFrf32zPHYGiKdvU5Djku1onbDU0Lw8w+5tguuEZ76kZ/lUcccGy5978FFmYpzY/65RHCpvLiLqYyWTtaNT1aQ/9pw4jX9HO9NfdJ9gYFK8r/2f36ZE4hxluAfeOXQfRC/WhPmiw/ReUhxPznG/WgKaa/OaRtAx3inbQ+JuCND7uuKeRe4osP2jLPHPP6AUwQKBgQDUNu3BkLoKaimjGOjCTAwtp71g1oo+k5/uEInAo7lyEwpV0EuUMwLA/HCqUgR4K9pyYV+Oyb8d6f0+Hz0BMD92I2pqlXrD7xV2WzDvyXM3s63NvorRooKcyfd9i6ccMjAyTR2qfLkxv0hlbBbsPHz4BbU63xhTJp3Ghi0/ey/1HQKBgQC2VsgqC6ykfSidZUNLmQZe3J0p/Qf9VLkfrQ+xaHapOs6AzDU2H2osuysqXTLJHsGfrwVaTs00ER2z8ljTJPBUtNtOLrwNRlvgdnzyVAKHfOgDBGwJgiwpeE9voB1oAV/mXqSaUWNnuwlOIhvQEBwekqNyWvhLqC7nCAIhj3yvNQKBgQCqYbeec56LAhWP903Zwcj9VvG7sESqXUhIkUqoOkuIBTWFFIm54QLTA1tJxDQGb98heoCIWf5x/A3xNI98RsqNBX5JON6qNWjb7/dobitti3t99v/ptDp9u8JTMC7penoryLKK0Ty3bkan95Kn9SC42YxaSghzqkt+uvfVQgiNGQKBgGxU6P2aDAt6VNwWosHSe+d2WWXt8IZBhO9d6dn0f7ORvcjmCqNKTNGgrkewMZEuVcliueJquR47IROdY8qmwqcBAN7Vg2K7r7CPlTKAWTRYMJxCT1Hi5gwJb+CZF3+IeYqsJk2NF2s0w5WJTE70k1BSvQsfIzAIDz2yE1oPHvwVAoGAA6e+xQkVH4fMEph55RJIZ5goI4Y76BSvt2N5OKZKd4HtaV+eIhM3SDsVYRLIm9ZquJHMiZQGyUGnsvrKL6AAVNK7eQZCRDk9KQz+0GKOGqku0nOZjUbAu6A2/vtXAaAuFSFx1rUQVVjFulLexkXR3KcztL1Qu2k5pB6Si0K/uwQ=";
|
||||||
|
|
||||||
private Client client = new Client(url, appId, privateKey, AllInOneTest::assertResult);
|
private Client client = new Client(url, appId, privateKey, AllInOneTest::assertResult);
|
||||||
|
@@ -35,7 +35,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.gitee.sop</groupId>
|
<groupId>com.gitee.sop</groupId>
|
||||||
<artifactId>sop-gateway-common</artifactId>
|
<artifactId>sop-gateway-common</artifactId>
|
||||||
<version>2.5.9-SNAPSHOT</version>
|
<version>2.5.10-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
|
Reference in New Issue
Block a user