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
* * @Description: 基础网关过滤器
* @Project:
* @CreateDate: Created in 2020/2/12 10:41
* @Author: liuke */ @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); } }