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<br>
|
*
|
* @Description: feign拦截器,只包含http相关数据
|
* @Project: <br>
|
* @CreateDate: Created in 2020/2/21 13:31 <br>
|
* @Author: <a href="4345453@kidgrow.com">liuke</a>
|
*/
|
@Slf4j
|
public class FeignHttpTenantInterceptorConfig {
|
protected List<String> 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<String> 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<String> 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;
|
}
|
}
|