Heroku

时间:2015-12-08 13:01:08

标签: spring spring-mvc heroku cors preflight

我有一个webapp分为两个应用程序:一个用Spring构建的API(4.2.3)和一个用AngularJS构建的前端(1.3.19)。这两个应用程序不在同一台服务器上,因此我正在努力处理跨源请求。当应用程序使用像GET on / articles这样的简单请求时,没问题。当应用程序使用带有JSON正文的POST /文章等预检请求时,我在OPTIONS请求中有一个403,用于检查POST是否可行。

web.xml:

<filter>
  <filter-name>cors</filter-name>
  <filter-class>com.clacsy.api.CORSFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name>cors</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

CORSFilter.java:

public class CORSFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)  throws IOException, ServletException {

        response.addHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
            response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
            response.addHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
        }

        filterChain.doFilter(request, response);
    }
}

请求标题:

  • Access-Control-Request-Headers:accept,content-type
  • 访问控制请求-方法:POST
  • 产地:http://localhost:9001

回应:

  • 请求方法:选项
  • 状态代码:403 Forbidden

回复标题:

  • Access-Control-Allow-Headers:accept,content-type
  • 访问控制允许方法:GET,POST,PUT,DELETE,OPTIONS
  • 访问控制允许来源:http://localhost:9001

我还尝试使用*来获取三个Access-Control-Allow-X的值,但仍然存在同样的问题。我在Chrome和Firefox上遇到了这个问题。在Safari上,我有403,但无论如何都要完成POST。

我在互联网上找到的这个问题的所有答案都没有帮助我。我不知道为什么OPTIONS请求发送回403,在我看来,所有的Access Control标头都设置为正确的值。

提前感谢您帮助我解决我面临的问题几天。

[更新] 如果我从localhost:9000上的AngularJS应用程序调用localhost:8080上的API,它正在运行!但是,当我从localhost:9000拨打到我在Heroku上托管的API时,它不是。 Heroku阻止了什么吗?

0 个答案:

没有答案