Spring CORS 控制器注释不起作用

Posted

技术标签:

【中文标题】Spring CORS 控制器注释不起作用【英文标题】:Spring CORS controller annotation not working 【发布时间】:2015-11-15 10:06:48 【问题描述】:

我想允许一个域的跨源请求。我的项目使用 Spring,所以我想利用新的 CORS 支持。

我对所有 springframework 依赖项使用版本 4.2.0

我按照这里的示例https://spring.io/blog/2015/06/08/cors-support-in-spring-framework#disqus_thread 并尝试了第一个版本。我的控制器注释看起来像:

@CrossOrigin(origins = "http://fiddle.jshell.net/", maxAge = 3600)
@Controller
@RequestMapping("/rest")
public class MyController 

如果我理解正确,mvc-config 是一种替代方法。我也试过了:

<mvc:cors>  
    <mvc:mapping path="/**"
        allowed-origins="http://fiddle.jshell.net/, http://domain2.com"
        allowed-methods="GET, PUT"
        allowed-headers="header1, header2, header3"
        exposed-headers="header1, header2" allow-credentials="false"
        max-age="123" />    
</mvc:cors>

使用这两种方法,响应似乎都不包含Access-Control-Allow-Origin 之类的任何内容,我也无法通过来自 jsfiddle 的简单查询返回结果。

从 localhost 运行和访问时,Chrome 开发者工具的标头信息如下。在这种情况下,请求来自同一个域,而不是通过 javascript,但我认为 CORS 注释无论如何都会添加访问控制参数?

响应标头:

Content-Length:174869 
Content-Type:text/html;charset=UTF-8 
Date:Fri, 21 Aug 2015 12:21:09 GMT 
Server:Apache-Coyote/1.1

请求头:

      Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*\/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,ro;q=0.6,de;q=0.4,fr;q=0.2
Cache-Control:no-cache 
Connection:keep-alive
Cookie:JSESSIONID=831EBC138D2B7E176DF4945ADA05CAC1;_ga=GA1.1.1046500342.1404228238; undefined=0 
Host:localhost:8080 
Pragma:no-cache 
Upgrade-Insecure-Requests:1 
User-Agent:Mozilla/5.0(Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36

我不使用 spring boot,我想我错过了一个配置步骤。

【问题讨论】:

我也尝试使用@RestController 而不是@Controller,但它似乎对标题没有任何影响。 您是否尝试过其他域?如果请求不是跨源的,那么我不明白为什么服务器应该在响应中添加 CORS 标头 你能以某种方式解决它吗?我也有同样的问题。 @SergDerbst 我没有使用 Spring CORS 注释。我改用 Spring Web 过滤器 (web.xml) 并为其扩展 org.springframework.web.filter.OncePerRequestFilter。第一次尝试就成功了。 好的,谢谢。我似乎也没有让它工作。这周晚些时候我会再试一次,所以如果我成功了,我会告诉你的。 【参考方案1】:

我已经为自己重现了这个问题。当我的 @Configuration 注释类中没有 @EnableWebMvc 注释时,就会出现问题。 我已将此问题报告为 Sping Jira 中的一个错误,并提供了详细信息:https://jira.spring.io/browse/SPR-13857

我在代码或文档中看到了修复。文档修复将在 @CrossOrigin 类 javadoc 中声明 @EnableWebMvc 是必需的,但我更喜欢代码中的修复,以便 cors 注释在没有 @EnableWebMvc 的情况下工作。

【讨论】:

我已经尝试使用@EnableWebMvc 但仍然无法正常工作:(【参考方案2】:

你能用"http://fiddle.jshell.net"代替"http://fiddle.jshell.net/"吗?

【讨论】:

我刚刚尝试过,但仍然看不到标题中的 CORS 内容。仅作记录,我从 jsfiddle 和浏览器中都进行了测试。 能否提供一个简单的项目来重现这个问题,我去看看。

以上是关于Spring CORS 控制器注释不起作用的主要内容,如果未能解决你的问题,请参考以下文章

注释 CrossOrigin 在 Spring Boot 中不起作用

邪恶的 CORS/CORB - Spring 和休眠、Springboot、Maven 和 Angular js 2,不起作用 - 允许访问控制来源

IntelliJ Spring Gradle 项目注释不起作用

JUnit 在带有 @Autowired 注释的 Spring Boot 中不起作用

带有 Spring 的 CORS 不起作用

控制器方法中 requestBody 上的 Spring Boot @Valid 不起作用