Java 无法使Jersey 2.x钩住CORS过滤器
我需要在jersey服务器端启用CORS标头,否则Angualr前端将获得: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
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应用程序
*
无效语法。第二个
对不起,我错过了
无效语法的关闭标记。第二个
对不起,我错过了
的关闭标记