Java 无法使Jersey 2.x钩住CORS过滤器

Java 无法使Jersey 2.x钩住CORS过滤器,java,jersey,cors,Java,Jersey,Cors,我需要在jersey服务器端启用CORS标头,否则Angualr前端将获得: 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

我需要在jersey服务器端启用CORS标头,否则Angualr前端将获得:

        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.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");

    }
}
包ny.devtest.endtoend.config;
导入ny.devtest.endtoend.api.OrderResource;
导入org.eclipse.persistence.jaxb.BeanValidationMode;
导入org.eclipse.persistence.jaxb.MarshallerProperties;
导入org.glassfish.hk2.utilities.binding.AbstractBinder;
导入org.glassfish.jersey.jackson.JacksonFeature;
导入org.glassfish.jersey.moxy.json.MoxyJsonConfig;
导入org.glassfish.jersey.moxy.json.MoxyJsonFeature;
导入org.glassfish.jersey.server.ResourceConfig;
导入org.glassfish.jersey.server.ServerProperties;
导入org.glassfish.jersey.server.validation.ValidationConfig;
导入org.glassfish.jersey.server.validation.internal.InjectingConstraintValidatorFactory;
导入javax.validation.ParameterNameProvider;
导入javax.validation.validation;
导入javax.ws.rs.container.ContainerRequestContext;
导入javax.ws.rs.container.ContainerResponseContext;
导入javax.ws.rs.container.ResourceContext;
导入javax.ws.rs.core.Context;
导入javax.ws.rs.ext.ContextResolver;
导入java.io.IOException;
导入java.lang.reflect.Constructor;
导入java.lang.reflect.Method;
导入java.util.array;
导入java.util.List;
公共类应用程序配置扩展了ResourceConfig{
私有void ApplicationInit(){
//资源。
包(OrderResource.class.getPackage().getName());
//验证。
属性(ServerProperties.BV_响应中的发送错误_,true);
属性(ServerProperties.BV_禁用_验证_对_可执行文件_覆盖_检查,true);
//提供者-JSON。
寄存器(JacksonFeature.class);
寄存器(MoxyJsonFeature.class);
寄存器(新MoxyJsonConfig().setFormattedOutput(true)
.property(MarshallerProperties.BEAN\u验证\u模式,BeanValidationMode.NONE)
.resolver());
}
公共应用程序配置(){
ApplicationInit();
//绑定(@Inject)
注册(新的ApplicationBinder());
}
公共应用程序配置(AbstractBinder customBinder){
ApplicationInit();
登记册(客户联);
}

@覆盖//有几个选项可以配置此选项

  • 您尝试的方式(在web.xml中)。这样,您1)指定了错误的init param名称。它应该是
    jersey.config.server.provider.classnames
    ,2)您需要将筛选器类的(完全限定)名称指定为init param值,而不是包

  • 您有一个java配置类(
    ApplicationConfig
    ),因此您可以在那里注册过滤器

  • 如果您正在使用包(或类路径)扫描,它应该自动选择过滤器并注册它,因为
    @Provider
    注释


  • 有关2或3的帮助,请显示您的
    应用程序配置
    类。我不确定您是否直接对
    应用程序
    资源配置
    进行子类化。它们的配置方式不同。

    有几个选项可用于配置

  • 您尝试的方式(在web.xml中)。这样,您1)指定了错误的init param名称。它应该是
    jersey.config.server.provider.classnames
    ,2)您需要将筛选器类的(完全限定)名称指定为init param值,而不是包

  • 您有一个java配置类(
    ApplicationConfig
    ),因此您可以在那里注册过滤器

  • 如果您正在使用包(或类路径)扫描,它应该自动选择过滤器并注册它,因为
    @Provider
    注释

  • 有关2或3的帮助,请显示您的
    应用程序配置
    类。我不确定您是否直接对
    应用程序
    资源配置
    进行子类化。它们的配置方式不同。

    让我们试试:

    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>
    
    
    Jersey Web应用程序
    org.glassfish.jersey.servlet.ServletContainer
    javax.ws.rs.Application
    ny.devtest.endtoend.config.ApplicationConfig
    jersey.config.server.provider.packages
    ny.devtest.endtoend
    1.
    Jersey Web应用程序
    *
    
    让我们试试:

    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>
    
    
    Jersey Web应用程序
    org.glassfish.jersey.servlet.ServletContainer
    javax.ws.rs.Application
    ny.devtest.endtoend.config.ApplicationConfig
    jersey.config.server.provider.packages
    ny.devtest.endtoend
    1.
    Jersey Web应用程序
    *
    
    无效语法。第二个
    对不起,我错过了
    无效语法的关闭标记。第二个
    对不起,我错过了
    的关闭标记