使用 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 支持的主要内容,如果未能解决你的问题,请参考以下文章