2017-02-14 98 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> 

你应该准备好现在去吧。

相关问题