使用 WADL 对 Jersey 应用程序的 CORS 支持

Posted

技术标签:

【中文标题】使用 WADL 对 Jersey 应用程序的 CORS 支持【英文标题】:CORS support for a Jersey app with WADL 【发布时间】:2013-06-16 09:11:32 【问题描述】:

我在 Eclipse 中有一个 Java 应用程序。使用 Jersey,它成功地在本地(localhost)创建了一个网页。

问题是我在另一台服务器上有一个 javascript 试图访问该网页,它会引发 CORS 错误。

Jersey/WADL 应用程序是否有任何内置的 CORS 支持?

我尝试创建一个支持 CORS 的 Jersey 过滤器 - 遵循这些 instructions。没有运气。 :( 我正在调查this,但不确定这是否是我想做的正确选择。

基本上,我的标题目前是这样的:

但我希望它看起来像这样:

谢谢大家!

编辑:

根据 jgm 的建议,我创建了一个过滤器(称为 CORSFilter)并添加了请求依赖项。我是否在 web.xml 文件中正确注册了过滤器?

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>createJPA</display-name>
  <servlet>
    <servlet-name>Jersey Root REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
 </servlet>
  <servlet-mapping>
    <servlet-name>Jersey Root REST Service</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
  <filter>
    <filter-name>CORSFilter</filter-name>
    <filter-class>model.producer.CORSFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CORSFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

【问题讨论】:

【参考方案1】:

这是一个简单的球衣CORS过滤器,改编自Weald Technology utilities:

import com.google.inject.Inject;
import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;
import com.wealdtech.jersey.CORSConfiguration;

/**
 * Filter to handle cross-origin resource sharing.
 */
public class CORSFilter implements ContainerResponseFilter

  private static final String ACAOHEADER = "Access-Control-Allow-Origin";
  private static final String ACRHHEADER = "Access-Control-Request-Headers";
  private static final String ACAHHEADER = "Access-Control-Allow-Headers";
  private static final String ACAMHEADER = "Access-Control-Allow-Methods";
  private static final String ACACHEADER = "Access-Control-Allow-Credentials";

  private final transient CORSConfiguration configuration;

  @Inject
  public CORSFilter(final CORSConfiguration configuration)
  
    this.configuration = configuration;
  

  @Override
  public ContainerResponse filter(final ContainerRequest request, final ContainerResponse response)
  
    response.getHttpHeaders().add(ACAOHEADER, this.configuration.getOrigin());

    final String requestHeaders = request.getHeaderValue(ACRHHEADER);
    response.getHttpHeaders().add(ACAHHEADER, requestHeaders);
    response.getHttpHeaders().add(ACAMHEADER, this.configuration.getAllowedMethods());
    response.getHttpHeaders().add(ACACHEADER, this.configuration.allowCredentials());

    return response;
  

对于配置,您可以use the existing configuration setup 或将其合并到您自己的系统中。请注意,这使用 Google Guice 来注入配置,如果您不使用 Guice,则需要手动执行此操作。

【讨论】:

我已经配置了 Google Guice。但是找不到解决“import com.wealdtech.jersey.CORSConfiguration”无法识别的jar。 嗯,配置类的链接在答案中,所以你可以拿走它并复制它。如果你想要完整的 JAR,它位于 maven group com.wealdtech artiface wealdtech-jersey-server 好吧,酷。我添加了 jar 并运行了应用程序。但它没有添加标题。也许过滤器没有与 .java 文件正确关联? 需要注册过滤器;你如何做到这一点取决于你如何初始化 Jersey,但是在 wealdtech-jersey-server JAR 中的 JerseyServletModule 中有一个 Guice 模块,你可以在 github.com/wealdtech/wealdtech/blob/develop/… 看到一个测试,它会启动一个服务器(代码在setUp() 方法) 抱歉,我避开了像瘟疫这样的整个 XML 配置内容,所以无法回答。

以上是关于使用 WADL 对 Jersey 应用程序的 CORS 支持的主要内容,如果未能解决你的问题,请参考以下文章

从WADL url生成java类(模型)

从 wadl 生成的 Java 代码没有实现

带有 JSON 表示语法的 WADL

springboot 之 JAX-RS 和 Jersey

CXF WADL 缺少复杂对象的详细信息

IBM ACE(新)- 调用在 WADL 或 API 中定义的 Rest API,没有 swagger 定义