package com.kidgrow.zuul.filter;
|
|
import cn.hutool.core.util.StrUtil;
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.serializer.SerializerFeature;
|
import com.kidgrow.common.model.ResultBody;
|
import com.kidgrow.common.utils.StrPool;
|
import com.kidgrow.zuul.config.IgnoreTokenConfig;
|
import com.netflix.zuul.ZuulFilter;
|
import com.netflix.zuul.context.RequestContext;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.cloud.netflix.zuul.filters.Route;
|
import org.springframework.cloud.netflix.zuul.filters.RouteLocator;
|
import org.springframework.web.util.UrlPathHelper;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
/**
|
* 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
|
*
|
* @Description: 基础网关过滤器<br>
|
* @Project: <br>
|
* @CreateDate: Created in 2020/2/12 10:41 <br>
|
* @Author: <a href="4345453@kidgrow.com">liuke</a>
|
*/
|
@Slf4j
|
public abstract class BaseFilter extends ZuulFilter {
|
protected static UrlPathHelper URL_PATH_HELPER = new UrlPathHelper();
|
/**
|
* 为zuul设置一个公共的前缀
|
*/
|
@Value("${server.servlet.context-path}")
|
protected String zuulPrefix;
|
@Value("${spring.profiles.active:dev}")
|
protected String profiles;
|
@Autowired
|
protected RouteLocator routeLocator;
|
|
protected boolean isDev() {
|
return !StrPool.PROD.equalsIgnoreCase(profiles);
|
}
|
|
/**
|
* 获取route
|
*
|
* @return
|
*/
|
protected Route route() {
|
HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
|
String requestURI = URL_PATH_HELPER.getPathWithinApplication(request);
|
return routeLocator.getMatchingRoute(requestURI);
|
}
|
|
private String getUri() {
|
RequestContext ctx = RequestContext.getCurrentContext();
|
HttpServletRequest request = ctx.getRequest();
|
String uri = request.getRequestURI();
|
uri = StrUtil.subSuf(uri, zuulPrefix.length());
|
uri = StrUtil.subSuf(uri, uri.indexOf("/", 1));
|
return uri;
|
}
|
|
/**
|
* 忽略应用级token
|
*
|
* @return
|
*/
|
protected boolean isIgnoreToken() {
|
return IgnoreTokenConfig.isIgnoreToken(getUri());
|
}
|
|
protected String getTokenFromRequest(String headerName, HttpServletRequest request) {
|
String token = request.getHeader(headerName);
|
if (StringUtils.isBlank(token)) {
|
token = request.getParameter(headerName);
|
}
|
return token;
|
}
|
|
|
/**
|
* 网关抛异常
|
*
|
* @param body
|
* @param code
|
*/
|
protected void setFailedRequest(String body, int code) {
|
log.debug("Reporting error ({}): {}", code, body);
|
RequestContext ctx = RequestContext.getCurrentContext();
|
// 返回错误码
|
ctx.setResponseStatusCode(code);
|
ctx.addZuulResponseHeader("Content-Type", "application/json;charset=UTF-8");
|
if (ctx.getResponseBody() == null) {
|
// 返回错误内容
|
ctx.setResponseBody(body);
|
// 过滤该请求,不对其进行路由
|
ctx.setSendZuulResponse(false);
|
}
|
}
|
|
protected void errorResponse(String errMsg, int errCode, int httpStatusCode) {
|
ResultBody tokenError = ResultBody.failed(errCode,errMsg);
|
setFailedRequest(JSON.toJSONString(tokenError, SerializerFeature.WriteMapNullValue), httpStatusCode);
|
}
|
}
|