http請求header相關的幾個常見問題

http協議多是目前web遠程調用領域最經常使用的協議,一如以前的soap協議。做爲輕量級可靠傳輸協議,基於http協議的服務幾乎成了restful的代名詞,今天列舉幾個使用過程當中http 相關的問題。nginx

  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。web

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"));api

  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_headers on;跨域

相關文章
相關標籤/搜索