我有一个 webapp 分为两个应用程序:一个使用 Spring (4.2.3) 构建的 API 和一个使用 AngularJS (1.3.19) 构建的前端。这两个应用程序不在同一台服务器上,所以我正在努力处理跨源请求。当应用程序在 /articles 上使用 GET 等简单请求时,没问题。当应用程序使用带有 JSON 正文的 POST /articles 之类的预检请求时,我在 OPTIONS 请求上有一个 403,用于检查 POST 是否可行。
网页.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);
}
}
请求标头:
- 访问控制请求标头:接受,内容类型
- 访问控制请求方法:POST
- 来源:http://localhost:9001
回复 :
- 请求方法:选项
- 状态码:403 禁止
响应标头:
- 访问控制允许标头:接受,内容类型
- 访问控制允许方法:GET、POST、PUT、DELETE、OPTIONS
- 访问控制允许来源:http://localhost:9001
我也尝试使用 * 三个 Access-Control-Allow-X 的值,但仍然是同样的问题。我在 Chrome 和 Firefox 上遇到了这个问题。在 Safari 上,我有一个 403,但 POST 还是完成了。
我在互联网上找到的这个问题的所有答案都没有帮助我。我不知道为什么 OPTIONS 请求发回 403,在我看来,所有访问控制标头都设置为正确的值。
提前感谢您帮助我解决我几天来面临的问题。
[更新]如果我从 localhost:9000 上的 AngularJS 应用程序调用我在 localhost:8080 上的 API,它正在工作!但是当我从 localhost:9000 调用托管在 Heroku 上的 API 时,情况并非如此。Heroku 是否阻止了什么?