簡體   English   中英

在resteasy中添加corsfilter后無法訪問服務

[英]Cannot access services after adding corsfilter in 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 -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 at 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 -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");

給了我訪問控制 - 允許 - 標題的麻煩,所以我把那一行都搞定了。

可以使用@ApplicationPath配置JAX-RS應用程序,而不使用web.xml和空的Application子類。 使用此類,這足以使您的JAX-RS應用程序被引導,並且JAX-RS運行時將掃描類路徑以查找使用@Path@Provider注釋的所有類,並自動向應用程序注冊這些類。

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

一旦覆蓋了getSingeletons()getClasses()並在其中任何一個中返回非空集,就會通過類路徑掃描禁用類的自動注冊。 由於您已經這樣做,您的資源不再自動注冊。 所以現在你可以做幾件事:

  1. 只需注冊自動注冊之前的資源類

     classes.add(MyResource.class); 
  2. 您可以查看此答案該答案使用使用@Provider注釋的Feature 由於類路徑掃描, Feature將被注冊。 在此功能中,您可以使用FeatureContext注冊CorsFilter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM