package com.kidgrow.ribbon.config; import com.kidgrow.common.constant.CommonConstant; import com.kidgrow.common.constant.SecurityConstants; import feign.RequestInterceptor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.annotation.PostConstruct; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
* * @Description: feign拦截器,只包含http相关数据 * @Project:
* @CreateDate: Created in 2020/2/21 13:31
* @Author: liuke */ @Slf4j public class FeignHttpTenantInterceptorConfig { protected List requestHeaders = new ArrayList<>(); @PostConstruct public void initialize() { requestHeaders.add(SecurityConstants.USER_ID_HEADER); requestHeaders.add(SecurityConstants.USER_HEADER); requestHeaders.add(SecurityConstants.USER_DEP_ID_HEADER); requestHeaders.add(SecurityConstants.USER_DEP_NAME_HEADER); requestHeaders.add(SecurityConstants.USER_ORG_ID_HEADER); requestHeaders.add(SecurityConstants.USER_ORGS_HEADER); requestHeaders.add(SecurityConstants.USER_ORG_NAME_HEADER); requestHeaders.add(SecurityConstants.ROLE_HEADER); requestHeaders.add(SecurityConstants.CLIENT_HEADER); //requestHeaders.add(SecurityConstants.TENANT_HEADER); requestHeaders.add(CommonConstant.KIDGROW_VERSION); requestHeaders.add(CommonConstant.USER_AGENT_BROWSER); requestHeaders.add(CommonConstant.USER_AGENT_IP); requestHeaders.add(CommonConstant.USER_AGENT_SYSTEM); } /** * 使用feign client访问别的微服务时,将上游传过来的access_token、clientid、tenantid、username、roles等信息放入header传递给下一个服务 */ @Bean public RequestInterceptor httpFeignInterceptor() { return template -> { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder .getRequestAttributes(); if (attributes != null) { HttpServletRequest request = attributes.getRequest(); Enumeration headerNames = request.getHeaderNames(); if (headerNames != null) { String headerName; String headerValue; while(headerNames.hasMoreElements()) { headerName = headerNames.nextElement(); if (requestHeaders.contains(headerName)) { headerValue = request.getHeader(headerName); template.header(headerName, headerValue); } } } //传递access_token,无网络隔离时需要传递 /* String token = extractHeaderToken(request); if (StrUtil.isEmpty(token)) { token = request.getParameter(CommonConstant.ACCESS_TOKEN); } if (StrUtil.isNotEmpty(token)) { template.header(CommonConstant.TOKEN_HEADER, CommonConstant.BEARER_TYPE + " " + token); } */ } }; } /** * 解析head中的token * @param request */ private String extractHeaderToken(HttpServletRequest request) { Enumeration headers = request.getHeaders(CommonConstant.TOKEN_HEADER); while (headers.hasMoreElements()) { String value = headers.nextElement(); if ((value.toLowerCase().startsWith(CommonConstant.BEARER_TYPE))) { String authHeaderValue = value.substring(CommonConstant.BEARER_TYPE.length()).trim(); int commaIndex = authHeaderValue.indexOf(','); if (commaIndex > 0) { authHeaderValue = authHeaderValue.substring(0, commaIndex); } return authHeaderValue; } } return null; } }