将corsfilter添加到ApplicationPath后,我无法访问任何服务

这是例子

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

import org.jboss.resteasy.plugins.interceptors.CorsFilter;


@ApplicationPath("/")
public class JaxRsActivator extends Application {
    private Set<Object> singletons = new HashSet<Object>();
    private Set<Class<?>> classes = new HashSet<Class<?>>();

    public JaxRsActivator() {
        CorsFilter corsFilter = new CorsFilter();
        corsFilter.getAllowedOrigins().add("*");
        corsFilter.setAllowedHeaders("Content-Type");
        singletons.add(corsFilter);
    }

    @Override
    public Set<Class<?>> getClasses() {
        return classes;
    }

    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }

}

如果我卷曲,我会得到这个,
curl -i http://localhost:8080/unika/usuarios -H "Origin:otherdomain.com"
HTTP/1.1 404 Not Found
Connection: keep-alive
Access-Control-Allow-Origin: otherdomain.com
X-Powered-By: Undertow 1
Server: Wildfly 8
Access-Control-Allow-Credentials: true
Content-Length: 0
Date: Tue, 16 Jun 2015 16:18:15 GMT

在服务器上我得到了

11:18:15,533警告[org.jboss.resteasy.core.ExceptionHandler](默认任务10)执行失败:javax.ws.rs.NotFoundException:找不到完整路径的资源:http://localhost:8080/unika/usuarios
在org.jboss.resteasy.core.registry.ClassNode.match(ClassNode.java:73)上[resteasy-jaxrs-3.0.10.Final.jar:]

如果我从代码中删除此行:
CorsFilter corsFilter = new CorsFilter();
        corsFilter.getAllowedOrigins().add("*");
        corsFilter.setAllowedHeaders("Content-Type");
        singletons.add(corsFilter);

评论完这些行后,我得到了curl的以下信息
$ curl -i http://localhost:8080/unika/usuarios -H "Origin:otherdomain.com"
HTTP/1.1 200 OK
Connection: keep-alive
Cache-Control: no-cache
X-Powered-By: Undertow 1
Server: Wildfly 8
Transfer-Encoding: chunked
Content-Type: application/json
Date: Tue, 16 Jun 2015 16:21:09 GMT

["Bill Burke","Stian Thorgersen","Stan Silvert","Gabriel Cardoso","Viliam Rockai","Marek Posolda","Bol"]

但是我需要访问控制允许起源

更新资料

您必须手动更新其他服务的类,例如
classes.add(MyRestService.class);
这条线
corsFilter.setAllowedHeaders("Content-Type");
给我带来了麻烦,access-Control-Allow-Headers,所以我选择了这条线,一切正常。

最佳答案

可以不使用web.xml来配置JAX-RS应用程序,而使用Application来配置空的@ApplicationPath子类。使用此类,足以引导您的JAX-RS应用程序,并且JAX-RS运行时将扫描类路径以查找所有带有@Path@Provider注释的类,并自动在应用程序中注册这些类。

@ApplicationPath("/api")
public class JaxRsApplication extends Application {}

一旦覆盖了getSingeletons()getClasses()并在其中任何一个中返回非空集,就可以通过类路径扫描禁用类的自动注册。既然这样做,您的资源将不再自动注册。所以现在您可以做几件事:
  • 只需注册自动注册之前的资源类
    classes.add(MyResource.class);
    
  • 您可以看看this answer,它使用带Feature注释的 @Provider 。由于进行了类路径扫描,因此Feature将被注册。在此功能中,您可以在CorsFilter中注册FeatureContext
  • 10-07 19:24
    查看更多