commit
758fcf363c
@ -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); |
||||
} |
||||
} |
||||
} |
@ -1,43 +1,66 @@ |
||||
package com.gitee.sop.gateway.controller; |
||||
|
||||
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.stereotype.Controller; |
||||
import org.springframework.web.bind.annotation.PathVariable; |
||||
import org.springframework.web.bind.annotation.RequestMapping; |
||||
|
||||
import javax.servlet.ServletException; |
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.IOException; |
||||
|
||||
/** |
||||
* 网关入口 |
||||
* |
||||
* @author tanghc |
||||
*/ |
||||
@Slf4j |
||||
@Controller |
||||
public class RedirectController { |
||||
|
||||
@Autowired |
||||
private ValidateService validateService; |
||||
|
||||
@Value("${zuul.servlet-path:/zuul}") |
||||
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}/") |
||||
public void redirect( |
||||
@PathVariable("method") String method |
||||
, @PathVariable("version") String version |
||||
, HttpServletRequest request |
||||
, HttpServletResponse response |
||||
) throws ServletException, IOException { |
||||
) { |
||||
request.setAttribute(SopConstants.REDIRECT_METHOD_KEY, method); |
||||
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); |
||||
} |
||||
|
||||
|
||||
} |
||||
|
Loading…
Reference in new issue