1

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

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

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

我尝试按照这些说明创建一个支持 CORS 的 Jersey 过滤器。没运气。:( 我正在研究这个,但不确定它是否是我想做的正确选择。

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

在此处输入图像描述

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

在此处输入图像描述

谢谢大家!

编辑:

根据 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>
4

1 回答 1

1

这是一个简单的球衣 CORS 过滤器,改编自Weald Technology 实用程序

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;
  }
}

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

于 2013-06-19T20:22:59.073 回答