【发布时间】:2015-03-15 09:02:14
【问题描述】:
我正在使用 apache tomcat V7.0。从客户端,我正在进行 ajax 调用以访问托管在 apache tomcat 服务器中并使用 JAX-RS 构建的 REST 服务。我只有一种休息 GET 方法。客户端与服务器不在同一个域中。假设我已经将 html 保存在我的桌面上,然后我正在运行 html 文件。这意味着我在没有域中拥有这个 html 文件。我得到的来自服务器的响应是:[HTTP/1.1 403 Forbidden 16ms]。这是一个 CORS 错误。为了摆脱这个错误,我做了以下事情: 客户端代码:
xmlhttp = new XMLHttpRequest();
xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xmlhttp.setRequestHeader("Access-Control-Allow-Origin", "*");
xmlhttp.setRequestHeader("Access-Control-Allow-Methods","GET, POST");
//Normal ajax calls of setting url and opening requests follows
服务器端web.xml配置:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.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,HEAD,OPTIONS,PUT</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param>
<init-param>
<param-name>cors.support.credentials</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.preflight.maxage</param-name>
<param-value>10</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
即使添加了所有的 cors 处理,在服务器端和客户端我都会收到 cors 错误。 我猜这个请求甚至没有到达过滤器并且被拒绝了。服务器中是否需要一些配置才能允许请求通过。在apache中,我在网上搜索,发现我们可以在.htaccess文件中这样做,但是在apache tomcat的情况下应该怎么做?
【问题讨论】:
-
403 并不是专门的 cors 错误。请将堆栈跟踪添加到您的问题以获得更好的答案。
-
我在 mozilla 中得到的确切错误是:Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at localhost:8080/restMailer/rest/mailService?query={%22subject%22:%22Test%201%22, %22vendorCode%22:%22V00002%22,%22name%22:%22Test%202%22,%22enquiry%22:%22Test%203%22,%22contactNumber%22:%22Test%204%22,%22email%22 :%22Test%205%22,%22icode%22:%22as723asd343ascfgru323sA!%22}。这可以通过将资源移动到同一域或启用 CORS 来解决。
-
看起来这个问题没有解决办法。我只是想在请求到达 tomcat 的 8080 端口时更改标头属性。
-
如果有人遇到此类问题并找到任何解决方案,请在此线程上发帖。对于解决方法,我改用 JSONP,并且在某种程度上浏览器允许 CORS。