我有一个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-Allow-X的值,但仍然存在同样的问题。我在Chrome和Firefox上遇到了这个问题。在Safari上,我有403,但无论如何都要完成POST。
我在互联网上找到的这个问题的所有答案都没有帮助我。我不知道为什么OPTIONS请求发送回403,在我看来,所有的Access Control标头都设置为正确的值。
提前感谢您帮助我解决我面临的问题几天。
[更新] 如果我从localhost:9000上的AngularJS应用程序调用localhost:8080上的API,它正在运行!但是,当我从localhost:9000拨打到我在Heroku上托管的API时,它不是。 Heroku阻止了什么吗?