如何从jquery发送$ .get请求时启用CORS?

时间:2017-08-30 01:46:59

标签: java jquery tomcat cors jax-rs

我已经设置了托管我的API代码的Tomcat 9服务器。我从邮递员那里打电话的时候工作正常。我还在Tomcat conf/web.xml文件中添加了以下过滤器:

<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param>
</filter>

我使用以下jQuery代码发送GET请求:

$(document).ready(function()
{
    $.get("http://localhost:8080/myapp/webapp/cars", function(data, status){
        alert("Data: " + data + "\nStatus: " + status);
});

它会抛出以下错误:

  

否&#39;访问控制 - 允许 - 来源&#39;标题出现在请求的上   资源。起源&#39; null&#39;因此不允许访问。

我是否应该在服务器端做更多的事情以允许跨源请求?

如何修改上述jQuery请求以消除此错误?

许多其他帖子建议使用ajax方法调用dataType:"jsonp"?是否有可能以某种方式对上述$.get方法进行修改?如果没有,请举例GETPOST以使用ajax方法启用CORS。

修改

我也试过以下配置:

<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>

......但它仍无效。

1 个答案:

答案 0 :(得分:1)

在使用Tomcat处理/创建响应时,您必须添加标头。

response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "Content-Type");

对问题Where do I add this的回应:

在为servlet准备响应时添加它(即适当的方法,在以下示例POST中):

public class MyServlet extends HttpServlet {

    @Override
    public void doPost(final HttpServletRequest request, 
                       final HttpServletResponse response) throws ServletException {
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type");
    }
}

如果你没有实现任何servlet并且你想通过配置(例如init-parameters)来实现它,你也可以将它添加到你的init参数中,但一定要有所有标题Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers都设置了相应的内容。

如果它仍然无法正常工作,则有助于查看响应中设置的标头,以确定哪个标头可能设置错误。