您的位置:首页 > 理论基础 > 计算机网络

http请求header相关的几个常见问题

2019-10-15 16:59 1426 查看

http协议可能是目前web远程调用领域最常用的协议,一如之前的soap协议。作为轻量级可靠传输协议,基于http协议的服务几乎成了restful的代名词,今天列举几个使用过程中http 相关的问题。

  1. 跨域
    大家也最常遇到,解决办法也有很多,譬如在网关服务中引入CorsFilter,指定或者放开所有的域名和header。
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}

另一种解决办法是调整代理服务器如nginx。

add_header 'Access-Control-Allow-Origin' '$http_origin';
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
  1. 中文header
    http协议不支持中文header!!!
    所以想要在header中传递中文信息,需要转码,接收端再解码。

Base64.encodeBase64String(origin.getBytes("utf-8"));

  1. header丢失
    刚遇到的一个问题,request header中有个参数request_user_id, 认证服务拦截器发现request.getHeader取不到。一开始怀疑是apigateway的问题,查看了apigateway的代码,发现只是普通的转发,并没有重新代理请求,所以不存在这个问题;将请求地址改为ip重试(一开始请求的是域名地址),发现可以获取header值,header参数的准入主要靠
    corsFilter的 config.addAllowedHeader(""),现在配置的是,也就是除了中文外的所有参数都应该能传递才对。
    重新梳理服务链路,域名解析-nginx-apigateway-目标服务,锁定到nginx头上。nginx内部的设置,也是允许所有,但是nginx还有个限制,就是下划线的参数,会被忽略(坑啊!)
    调整nginx的http参数,打开下划线参数,重启,问题得到解决。

underscores_in_he
10d2
aders on;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: