当前位置: 首页 > 知识库问答 >
问题:

WebTestClient-CORS带Spring Boot和Webflux

宓英哲
2023-03-14

我有Vuejs前端和一个Spring Boot Webflux控制器。现在浏览器在调用Spring Boot时会与CORS抱怨。

java.lang.AssertionError: Response header 'Access-Control-Allow-Origin' expected:<[*]> but was:<null>

> OPTIONS /cors-enabled-endpoint
> WebTestClient-Request-Id: [1]
> Origin: [http://any-origin.com]
> Access-Control-Request-Method: [GET]

No content

< 500 INTERNAL_SERVER_ERROR Internal Server Error
< Vary: [Origin, Access-Control-Request-Method, Access-Control-Request-Headers]

0 bytes of content (unknown content-type).

java.lang.AssertionError: Response header 'Access-Control-Allow-Origin' does not exist

你知道为什么上面链接中描述的CORS配置不起作用吗?我还尝试在全局配置上启用CORS,并使用WebFilter启用CORS。但似乎什么都不管用。

共有1个答案

钱经赋
2023-03-14

对我来说,在不添加spring-starter-web依赖项的情况下,实际有效的方法是使用web过滤器,如果http方法是Options,则强制返回。

@Configuration
public class CorsGlobalConfiguration implements WebFilter {


@Override
public Mono<Void> filter(ServerWebExchange serverWebExchange,
                         WebFilterChain webFilterChain) {
    ServerHttpRequest request = serverWebExchange.getRequest();
    ServerHttpResponse response = serverWebExchange.getResponse();
    HttpHeaders headers = response.getHeaders();
    headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
    headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "POST, GET, PUT, OPTIONS, DELETE, PATCH");
    headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
    headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");
    headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
    headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "18000L");
    if (request.getMethod() == HttpMethod.OPTIONS) {
        response.setStatusCode(HttpStatus.OK);
        return Mono.empty();//HERE
    }
    return webFilterChain.filter(serverWebExchange);
}


}

来源

 类似资料:
  • 我在控制器中使用了Spring,它工作得很好。但是在单元测试中,我使用获得。这里有一个例子: 如何使单元测试工作。或者甚至不需要在WebFlux中使用?

  • 使用REST API和Spring启动Web测试客户端,我可以轻松地从返回的JSON中取回解析的对象,如下所示: 使用graphql,json被包装在如下数据属性中: 所以它不能和 因为JSON解析器以“数据”而不是“data.person”开头。 如何实现直接解析JSON结果并返回Person对象?

  • 我试图从一个应用程序(spring-boot应用程序)调用另一个应用程序(angularjs)上的RESTendpoint。应用程序正在下列主机和端口上运行。 REST应用程序,使用Spring Boot, HTML应用程序,使用angularjs, 处理程序所做的只是根据用户是否登录、身份验证失败或注销,写出类似的JSON响应。如下所示。 对我错过了什么或者做错了什么有什么想法吗?

  • 我在本地环境中安装了ES5.4,我尝试使用ajax请求(使用jQuery)从我的Web浏览器向API发出请求,CORS策略破坏了它。 我阅读了ES HTTP文档和一些论坛,但我无法解决我的问题。 下面是我的elasticsearch.yml http conf: 以下是我的请求参数: 这是来自浏览器的结果:Code POST 200 OK 在浏览器网络工具中,我在结果中得到了一些对象,这很好,但我

  • 当我们需要调用Ajax请求时,我们需要: 我已经知道,使用,我们可以发出一个跨源请求,并添加源标题。 问题: > 它是在浏览器(支持CORS)执行请求时添加的吗?(跨域还是非跨域? 我的意思是:他**是什么意思? 跨源HTTP请求有一个源标头。此标头向服务器提供请求的来源。此标头受浏览器保护,不能从应用程序代码更改。本质上,它是跨文档消息传递中使用的消息事件上的origin属性的网络等价物。原始标

  • 当我试图在Spring4.x上进行测试时,我使用了MockMvc web客户端,但我正在阅读和尝试Spring5.x的新特性。 我认为,WebTestClient和MockMvc是相同或非常相似的。 MockMvc和WebTestClient之间的区别是什么?