我在 localhost:9090 运行我的 tomcat 7 服务器,xampp 在端口 80 上运行。我想从端口 80 向端口 9090 上的 REST-API (Spring 4.2.2) 发出 PUT 请求(使用 jQuery)。
我收到这个错误:
XMLHttpRequest cannot load http://localhost:9090/rest/location/8609d865-d87a-4340-ab87-0e7f90a6fda9. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. The response had HTTP status code 403.
谷歌搜索后,我找到了几个解决方案 - 但没有一个有效。
我尝试了什么:
-在web.xml中添加过滤器
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-向我的 Controller 添加注解
@CrossOrigin
@RestController
public class LocationController
-为我的回复添加标题
return ResponseEntity.status(HttpStatus.OK).header("Access-Control-Allow-Origin", "*").build();
-添加一个OPTIONS路由
@RequestMapping(value = "/**", method = RequestMethod.OPTIONS)
@ResponseBody
public ResponseEntity options(@PathVariable String locationID) {
return ResponseEntity.status(HttpStatus.OK).header("Access-Control-Allow-Origin", "*").build();
}
它们都不适合我,我仍然收到上述错误。有什么想法吗?
最佳答案
这就是我在当前项目中的做法:
- 在
pom.xml
中添加了以下依赖项
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>2.4</version>
</dependency>
- 在
web.xml
中添加了以下过滤器
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<init-param>
<param-name>cors.supportedMethods</param-name>
<param-value>GET, POST, HEAD, OPTIONS, DELETE, PUT</param-value>
</init-param>
</filter>
- 将过滤器映射添加到过滤器映射列表的顶部
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
请注意,我明确添加了 PUT
作为支持的方法。
这种方法的唯一缺点是额外的依赖性。
spring-web
有自己的 CORS 过滤器实现(org.springframework.web.filter.CorsFilter
)。我确信可以用相同的方式配置 Spring 。
关于spring - 无法使用 Spring 和 Tomcat 启用 CORS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38149663/