2017-02-14 96 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也會返回正確的響應。

如果郵遞員工作正常,你必須要知道的事實,右側前提出請求的角度發出另一個請求,叫做飛行前請求,這確實一個最小的檢查,在服務器端的端點。

這請求是OPTIONS類型請求。

首先,您必須確保您的調度員服務器接受選項請求。

spring.mvc.dispatch-options-request=true 

或者通過配置web.xml

在配置它接受OPTIONS請求,創建一個Filter.java和配置:您可以通過在一個*.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{} 
} 

最後,不要忘了在web.xml與以下的init-PARAMS一起添加此過濾器。

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

你應該準備好現在去吧。

相關問題