无法制作球衣2.x挂钩CORS过滤器



我需要在泽西服务器端启用CORS标题

        XMLHttpRequest cannot load http://localhost:8080/api/products. 
    No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://localhost:9000' is therefore not allowed access.

正如泽西文档所解释的那样,我设置了过滤器,并可以使用web.xml

发现它。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>ny.devtest.endtoend.config.ApplicationConfig</param-value>
            <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
            <param-name>ny.devtest.endtoend</param-name>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>*</url-pattern>
    </servlet-mapping>
</web-app>

过滤器截距实现:

package ny.devtest.endtoend;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
@Provider
public class ResponseCorsFilter implements ContainerResponseFilter {
    public ResponseCorsFilter() {
        System.out.println("ServerResponseFilter initialization");
    }
    @Override
    public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException {

        containerResponseContext.getHeaders().add("X-Powered-By", "Jersey :-)");
        containerResponseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
        containerResponseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
    }
}

它不起作用。

更新:

package ny.devtest.endtoend.config;
import ny.devtest.endtoend.api.OrderResource;
import org.eclipse.persistence.jaxb.BeanValidationMode;
import org.eclipse.persistence.jaxb.MarshallerProperties;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.moxy.json.MoxyJsonConfig;
import org.glassfish.jersey.moxy.json.MoxyJsonFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.ServerProperties;
import org.glassfish.jersey.server.validation.ValidationConfig;
import org.glassfish.jersey.server.validation.internal.InjectingConstraintValidatorFactory;
import javax.validation.ParameterNameProvider;
import javax.validation.Validation;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ResourceContext;
import javax.ws.rs.core.Context;
import javax.ws.rs.ext.ContextResolver;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
public class ApplicationConfig  extends ResourceConfig {
    private void ApplicationInit(){
        // Resources.
        packages(OrderResource.class.getPackage().getName());
        // Validation.
        property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
        property(ServerProperties.BV_DISABLE_VALIDATE_ON_EXECUTABLE_OVERRIDE_CHECK, true);
        // Providers - JSON.
        register(JacksonFeature.class);
        register(MoxyJsonFeature.class);
        register(new MoxyJsonConfig().setFormattedOutput(true)
                .property(MarshallerProperties.BEAN_VALIDATION_MODE, BeanValidationMode.NONE)
                .resolver());
    }
    public ApplicationConfig() {
        ApplicationInit();
        // Bindings (@Inject)
        register(new ApplicationBinder());
    }
    public ApplicationConfig(AbstractBinder customBinder) {
        ApplicationInit();
        register(customBinder);
    }
    @Override // << NOT WORKING
    public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException {
        containerResponseContext.getHeaders().add("X-Powered-By", "Jersey :-)");
        containerResponseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
        containerResponseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
    }
}

让我们尝试一下:

package ny.devtest.endtoend.config;
import org.glassfish.jersey.server.ResourceConfig;
import ...
public class ApplicationConfig  extends ResourceConfig {
    private void ApplicationInit(){
        // Resources.
        packages(OrderResource.class.getPackage().getName());
        // Register CORS filter.
        register(ny.devtest.endtoend.ResponseCorsFilter.class);
        // Register the rest you need
        ...
    }
     public ApplicationConfig() {
        ApplicationInit();
        // Bindings (@Inject)
        register(new ApplicationBinder());
    }
   ...
}

和在 web.xml中配置

<servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>ny.devtest.endtoend.config.ApplicationConfig</param-value>
        </init-param>
        <!-- Add parameter for CORS filter -->
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>
               ny.devtest.endtoend
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>*</url-pattern>
    </servlet-mapping>

有一些选项可以配置此

  1. 您的方式尝试要做(在web.xml中)。这样,您是1)指定错误的init-param名称。它应该是jersey.config.server.provider.classnames和2)您需要指定过滤类别的(完全合格的) name 作为init-Param值,而不是软件包。

  2. 您有Java配置类(ApplicationConfig),因此您可以在此处注册过滤器

  3. 如果您使用的是软件包(或classPath)扫描,则应自动拾取过滤器并注册它,因为@Provider注释。

要获得2或3的帮助,请向您的ApplicationConfig课程展示。我不确定您是直接亚级别Application还是ResourceConfig。它们的配置方式不同。

最新更新