2017-02-14 9 views
2

角度とスプリングブートを使用して、私たちのサービスに認証を追加しようとしていますが、何らかの理由で私たちが知っているURLからデータを開くことはできません。プリフライトのレスポンスに無効なHTTPステータスコードがあります:401角度

角度:

this.getMismatches = function() { 
    return $http({ 
      "async": true, 
      "crossDomain": true, 
      "url": GLOBALS.mismatchUrl, 
      "method": "GET", 
      "headers": { 
       "authorization": "Basic YWRtaW46USNROawdNmY3UWhxQDlQA1VoKzU=" 
     } 
    }); 
} 

(現在ログイントークンは、ハードテスト目的のために符号化される)

RESTサービス:

@CrossOrigin(origins = "*") 
@RequestMapping("/api/mismatch") 
public List<Mismatch> home() { 
    return service.getAll(); 
} 

CrossOrigin = *はCORSの問題を処理する必要がありますが、この失敗したURL呼び出しは本当に奇妙です。私たちが試した

余分なもの:

'Access-Control-Allow-Methods', 'GET, POST, OPTIONS' 
'Access-Control-Allow-Origin', '*' 
'Content-Type', json plaintext jsonp etc 

App.js: 
    $httpProvider.defaults.headers.common = {}; 
    $httpProvider.defaults.headers.post = {}; 
    $httpProvider.defaults.headers.put = {}; 
    $httpProvider.defaults.headers.patch = {}; 
+0

'GLOBALS.mismatchUrl'には何が設定されていますか?私はそれが全く理由のない "無効なURL"とは言わないと思います... –

+0

私の悪い、間違ったエラーメッセージを掲載しました。 – Laurens

+0

あなたは郵便配達員で応答を受け取ることができますか? –

答えて

7

あなたは期待通りに郵便配達を使って、あなたが回答を得ることができることをあなたのコメントに言及しています。それは良い出発点です。 curlコマンドを使用することによって、端末からのcurl -i -X URLも正しい応答を返すと考えられます。

郵便配達員が正しく機能する場合は、リクエストを送信する直前にというフライト前のリクエストという別のリクエストが送信され、サーバー側のエンドポイントに対して最小限の確認が行われることに注意する必要があります。

このリクエストはオプションタイプのリクエストです。

まず、あなたはあなたののDispatcherServletOPTIONS要求を受け入れることを確認する必要があります。あなたは、OPTIONS要求を受け入れるFilter.javaを作成して設定するには、それを構成した後

spring.mvc.dispatch-options-request=true 

またはweb.xml

を構成することによって:あなたのような、*.properties設定ファイルでそれを指定することで、このいずれかを達成することができますCORSフィルター。あなたは、次の例により導くことができる

:最後に

public class CorsFilter implements Filter{ 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, 
        FilterChain filterChain) throws IOException, ServletException { 

    if(response instanceof HttpServletResponse){ 
     HttpServletResponse alteredResponse = ((HttpServletResponse)response); 
     addCorsHeader(alteredResponse); 
    } 

    filterChain.doFilter(request, response); 
} 

private void addCorsHeader(HttpServletResponse response){ 
    //TODO: externalize the Allow-Origin 
    response.addHeader("Access-Control-Allow-Origin", "*"); 
    response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD"); 
    response.addHeader("Access-Control-Allow-Headers", "Authorization, X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept"); 
    response.addHeader("Access-Control-Max-Age", "1728000"); 
} 

@Override 
public void destroy() {} 

@Override 
public void init(FilterConfig filterConfig)throws ServletException{} 
} 

、次のinit-のparamsと共にweb.xmlにこのフィルタを追加することを忘れないでください。

<filter> 
    <filter-name>cors-filter</filter-name> 
    <filter-class>ai.surge.usrmngmtservice.util.cors.CorsFilter</filter-class> 
    <init-param> 
     <param-name>cors.allowed.origins</param-name> 
     <param-value>*</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.allowed.methods</param-name> 
     <param-value>GET,POST,OPTIONS,PUT</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.exposed.headers</param-name> 
     <param-value>Authorization,Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> 
    </init-param> 
    <!--<init-param>--> 
     <!--<param-name>cors.preflight.maxage</param-name>--> 
     <!--<param-value>1800</param-value>--> 
    <!--</init-param>--> 
</filter> 

今すぐ準備する必要があります。

関連する問題