【发布时间】:2016-08-04 18:18:00
【问题描述】:
我用 Spring 实现了 REST Web 服务。当我将它作为 Spring Boot 应用程序部署在 Eclipse 中时,它可以工作。但是,当我将它部署在同一台机器上的 Tomcat 7 中时,它不起作用。错误信息如下:
XMLHttpRequest cannot load http://localhost:8080/ristoreService/oauth/token. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:8081' is therefore not allowed access.
我的 CORS 过滤器如下所示:
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CORSFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8081");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me, "
+ "Origin,Access-Control-Request-Method, Access-Control-Request-Headers, Authorization");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, res);
}
}
如果我注释掉response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8081");,我仍然会得到同样的错误。即使我在 Eclipse 中部署,如果没有这条线,它也不会工作。为什么部署在同一个ip不同环境下会有不同的表现?
编辑:
我用休息客户端测试器“CocoaRestClient”测试了网址http://localhost:8080/ristoreService/oauth/token,得到了404。所以我编了一个显然不存在的网址http://localhost:8080/xxxxx并在UI(angularjs)中运行它,再次得到CORS错误。我认为这个错误有点误导,毕竟是404。但是为什么在Tomcat的webapps下以ristoreService.war的名称成功部署war时它会抱怨找不到?
【问题讨论】:
-
@Ulises 在我的帖子中提到了
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:8081' is therefore not allowed access.
标签: eclipse spring rest tomcat xmlhttprequest