微服务开发中使用了feign RequestInterceptor 接口自动传递头部信息导致400错误!
试了这些方式都未解决网上的方法,可以参考
个人最终解决办法,就是过滤可能导致错误的请求头,比如 content-length 下面附代码!
import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
/**
* 导入模块 feign请求带上当前head
* 2022/08/03 修改注释 解决异常
* @date 2019/10/5
*/
@Slf4j
@Configuration
public class FeignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String values = request.getHeader(name);
if(checkEssential(name)){
log.info("不加hande: {}->{}", name, values);
}else {
requestTemplate.header(name, values);
log.info("添加hande: {}->{}", name, values);
}
}
}
log.info("--------------------------------------------------------");
}
}
List<String> headers = Arrays.asList( "content-length");
/**
* 请求头必要传递参数过滤,只携带必要请求头信息
*
* @param name
* @return
*/
private boolean checkEssential(String name) {
return headers.stream().anyMatch(e -> e.equalsIgnoreCase(name));
}
}