java - resteasy中添加corsfilter后无法访问服务

标签 java jax-rs resteasy

将 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 我得到这个,

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 WARN [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"]

但我需要 Access-Control-Allow-Origin

更新

你必须手动更新你的休息服务类

classes.add(MyRestService.class);

还有这一行

corsFilter.setAllowedHeaders("Content-Type");

给我带来了 access-Control-Allow-Headers 的麻烦,所以我选择了那条线,一切正常。

最佳答案

JAX-RS 应用程序可以配置为没有 web.xml 和带有 @ApplicationPath 的空 Application 子类。有了这个类,这足以引导您的 JAX-RS 应用程序,并且 JAX-RS 运行时将扫描类路径以查找所有用 @Path@Provider 注释的类>,并自动向应用程序注册这些类。

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

一旦您覆盖了 getSingeletons()getClasses() 并在其中任何一个中返回了一个非空集合,您就可以通过类路径扫描禁用类的自动注册.由于您这样做了,您的资源将不再自动注册。所以现在你可以做几件事:

  1. 只需注册之前自动注册的资源类

    classes.add(MyResource.class);
    
  2. 你可以看看this answer ,它使用 Feature@Provider 注释。由于类路径扫描,Feature 将被注册。在此功能中,您可以使用 FeatureContext 注册 CorsFilter

关于java - resteasy中添加corsfilter后无法访问服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30873082/

相关文章:

google-app-engine - 使用 google appengine maven 插件部署 Jax-RS war

json - 为什么 Rest-Easy 和 Jersey 有不同的 JSON 输出格式?

ssl - 如何强制我的 RESTEasy HTTP 客户端使用 TLSv1.2?

java - JAX-RS 2.0/RESTeasy 中的版本 API

java - 如何使用JDT确定类是AnnotationDeclaration还是TypeDeclaration

java - 在 Spring security 2.0.2 登录后如何重定向到请求的 url

java - 使用 MOXy 解码 LocalDate/LocalDateTime

java - 发现从元素 'jaxrs:servicebeans' 开始的无效内容”

java - 使用java交换3*4矩阵中的列

java - 在同一个线程中创建多个计时器会导致主线程滞后