【问题标题】:Spring: CrossOrigin not working with ResponseEntitySpring:CrossOrigin 不适用于 ResponseEntity
【发布时间】:2020-01-24 17:22:51
【问题描述】:

关于在春季启用CORS 有很多问题,但似乎并非所有这些问题都有有效答案,或者接受的答案对我的情况不起作用。所以我正在创建这个问题,看看是否有人可以帮助我。

我一直在尝试启用 CORS 对我的 API 响应的响应,我尝试将 @CrossOrigin 注释添加到方法中,甚至添加到类控制器中以使其工作,但两者都没有方法不起作用。我还尝试在应用程序引导配置或实现WebMvcConfigurer 的类配置上创建Bean,但最终结果仍然相同。

起初我认为这可能是因为我使用ResponseEntity 实例返回响应,而不是像大多数示例显示的那样仅返回实际值,但即使替换了我返回值的方式,结果仍然相同。没有CORS 标头附加到响应中,即使在OPTIONS http 方法中,当它被请求时,它只响应没有Cross Origin Allow 的普通标头。

所以为了展示我一直在努力实现CORS,这是我的RestController 课程之一:

package com.vod.cloudservice.controller;

import com.vod.cloudservice.entity.Series;
import com.vod.cloudservice.service.SeriesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

@RestController
@RequestMapping("/series")
public class SeriesController {
    @Autowired
    SeriesService seriesService;

    @CrossOrigin
    @GetMapping
    public ResponseEntity<List<Series>> getSeriesList() {
        List<Series> seriesList = this.seriesService.findAll();

        return new ResponseEntity<>(seriesList, HttpStatus.OK);
    }

    // More resources ahead.
}

单独这样做是行不通的。所以我创建了一个这样的配置类:

package com.vod.cloudservice.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
            .allowedOrigins("*")
            .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
            .allowedHeaders("Content-Type")
            .maxAge(3600);
    }
}

即使这样,响应仍然相同。如果它有助于了解对我希望启用CORS 的控制器的完整请求,请求是这样完成的:

GET: http://localhost:8080/series

我可能通过拦截响应并手动添加标头来解决此问题,但我希望更好地控制响应,例如我想在一个类上处理 X 数量的允许方法。

【问题讨论】:

    标签: java spring cors


    【解决方案1】:

    我对这件事做了更多的研究,我发现RestController注解使得响应头在处理CORS注解的时候就已经写好了,就好像CORS处理程序一样无法写入已经发送的内容。

    所以在我的例子中,我创建了一个过滤器类,它将在响应中添加CORS 标头,如下所示:

    public class HttpFilter extends OncePerRequestFilter {
        @Override
        protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
            httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
            httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
            httpServletResponse.setHeader("Access-Control-Allow-Headers", "Content-Type");
            httpServletResponse.setHeader("Access-Control-Max-Age", "3600");
    
            filterChain.doFilter(httpServletRequest, httpServletResponse);
        }
    }
    

    在此之后,我只需将过滤器注册为FilterBean,然后它就可以工作了,虽然不是我最初想要的方式,但它至少给了我工作所需的结果。

    【讨论】:

      【解决方案2】:
      allowedHeaders("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Authorization, Origin, Accept, Access-Control-Request-Method, Access-Control-Request-Headers");
      

      【讨论】:

      • 我不太明白你的回答。
      猜你喜欢
      • 2019-01-30
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多