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;
}
}