在 Spring Data Rest 中启用跨源请求

Posted

技术标签:

【中文标题】在 Spring Data Rest 中启用跨源请求【英文标题】:Enabling cross origin requests in Spring Data Rest 【发布时间】:2017-07-27 21:35:21 【问题描述】:

我有一个使用 Angular 2 和 Spring Boot 开发的 Web 应用程序。我使用 spring-boot-data-rest 依赖项将我的存储库公开为 HTTP 端点。

在开发过程中,我在运行在端口 8080 上的本地 tomcat 上运行我的后端 spring boot 项目。为了开发前端,我使用 angular-cli 在端口 4200 上为我的 Angular 2 应用程序提供服务。我在 4200 上运行的前端需要能够访问 8080 上暴露的端点,但这不起作用,因为:

请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://localhost:4200' 因此不允许访问。

如果这些是我手动输入 @RestController 的自定义端点,我可以简单地添加 @CrossOrigin 注释:

@RestController
public class MyController 
    @CrossOrigin(origins = "http://localhost:4200")
    @RequestMapping(value = "/whatever")
    public void whatever() 
        //whatever
    

但是对于spring-boot-data-rest 暴露的端点,我显然不能这样做。那么,如何使这些端点可以从 http://localhost:4200 源访问?

【问题讨论】:

我最近遇到了这个问题;如果您使用的是最新版本的 Spring Data,一切都会好起来的 (***.com/a/42403956/4922375),否则,您必须自己编写一个过滤器,为每个响应设置一些标头。 【参考方案1】:

也许您可以使用以下组件来启用 CORS 请求。 全局应用于应用程序

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SimpleCorsFilter implements Filter 

  public SimpleCorsFilter() 
  

  @Override
  public void destroy() 
  

  @Override
  public void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException 
    final HttpServletResponse response = (HttpServletResponse) res;
    final HttpServletRequest request = (HttpServletRequest) req;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, token");

    if ("OPTIONS".equalsIgnoreCase(request.getMethod())) 
      response.setStatus(HttpServletResponse.SC_OK);
     else 
      chain.doFilter(req, res);
    
  

  @Override
  public void init(final FilterConfig filterConfig) 
  

【讨论】:

【参考方案2】:

我已使用我的自定义 CORS 过滤器使其工作:

/**
 * Filter for enabling CORS support.
 */
@Component
public class CorsFilter extends OncePerRequestFilter 

    @Override
    protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response,
                                    final FilterChain filterChain) throws ServletException, IOException 
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, PATCH, HEAD, OPTIONS");
        response.addHeader("Access-Control-Allow-Headers", "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
        response.addHeader("Access-Control-Expose-Headers", "Access-Control-Allow-Origin, Access-Control-Allow-Credentials");
        response.addHeader("Access-Control-Allow-Credentials", "true");
        response.addIntHeader("Access-Control-Max-Age", 10);
        filterChain.doFilter(request, response);
    

【讨论】:

以上是关于在 Spring Data Rest 中启用跨源请求的主要内容,如果未能解决你的问题,请参考以下文章

从 Angular4 调用 Spring Rest 服务时的 CORS(跨源问题)

为 API Gateway REST API 资源启用 CORS

Spring Boot Data Rest + CORS 未正确启用 OPTIONS/DELETE

如何在 Grails 3.0.1 中启用 CORS

默认情况下,不要使用Spring Data Rest和Jpa公开Entity类中的字段

使用 CORS 过滤器的跨源请求