我已经设置了托管我的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
方法进行修改?如果没有,请举例GET
和POST
以使用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>
......但它仍无效。
答案 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-Origin
,Access-Control-Allow-Methods
,Access-Control-Allow-Headers
都设置了相应的内容。
如果它仍然无法正常工作,则有助于查看响应中设置的标头,以确定哪个标头可能设置错误。