【问题标题】:Java Jersey 1.8, adding CORS Filter does not workJava Jersey 1.8,添加CORS过滤器不起作用
【发布时间】:2016-06-09 14:35:37
【问题描述】:

我正在尝试向我的 Jersey 1.8 WebService 添加一个 CORS 过滤器。

    @ApplicationPath("/")
    public class RESTConfig extends Application {

        @Override
        public Set<Class<?>> getClasses() {                
            Set<Class<?>> set = new HashSet<>();
            set.add(CORSFilter.class);
            set.add(super.getClass());
            return super.getClasses(); //To change body of generated methods, choose Tools | Templates.
        }    
    }

这是我的 CORSFilter 来自 here():

    @Provider
    public class CORSFilter implements ContainerResponseFilter {
        @Override
        public ContainerResponse filter(ContainerRequest request,
                ContainerResponse response) {

            response.getHttpHeaders().add("Access-Control-Allow-Origin", "*");
            response.getHttpHeaders().add("Access-Control-Allow-Headers",
                    "origin, content-type, accept, authorization");
            response.getHttpHeaders().add("Access-Control-Allow-Credentials", "true");
            response.getHttpHeaders().add("Access-Control-Allow-Methods",
                    "GET, POST, PUT, DELETE, OPTIONS, HEAD");

            return response;
        }
    }

我的 Javascript-WebApp 仍然收到 CORS 错误。 查看网络流量,没有发送 CORS 标头。我在这里错过了什么?

【问题讨论】:

  • CORS 过滤器来自这里:stackoverflow.com/questions/28065963/…
  • 懒得测试,但是如果你把它添加到覆盖Set&lt;Object&gt; getSingletons(),而不是getClasses(),会发生什么。其次super.getClasses() 什么也不返回。您应该只是返回集合。
  • 肯定的。是一个错字!谢谢你。

标签: javascript java jersey cors


【解决方案1】:

您的RESTConfig 不正确

@ApplicationPath("/")
public class RESTConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> set = new HashSet<>();
        set.add(CORSFilter.class);

        // wrong
        //set.add(super.getClass());
        //return super.getClasses();

        // corrected
       set.addAll(super.getClasses());
       return set;
    }    
}

此外,如果您覆盖 getClasses() 方法,您不仅应该添加过滤器,还应该添加所有 REST 资源

       set.add(MyHelloWorldResource.class);
       set.add(AnotherResource.class);

作为替代方案,您可以扩展 Jerseys ResourceConfig 类,在这种情况下,您可以指定要扫描整个包的资源和过滤器。

public class RESTConfig extends ResourceConfig {
    public RESTConfig() {
        // scan the whole package and register all appropriate classes
        packages("org.foo.rest;org.bar.rest");
        // register single class
        register(CORSFilter.class);
    }
}

更多信息请参考Jersey documentation

【讨论】:

  • 谢谢。这就是答案。如果您有时间并且知道后续错误试图告诉我什么,请做我的客人 :-) com.sun.jersey.api.container.ContainerException: ResourceConfig 实例不包含任何根资源类。
  • @user3601578 当您有一个空的Application 子类(或从getClasses() 和getSingletons() 返回空集)时,它会自动触发扫描具有@Path 和@Provider 的类。一旦您覆盖上述方法之一并返回 non-empty 集,它就会取消扫描。因此,如果扫描是您之前依赖的方法,那么您只需通过覆盖 getClasses 来取消它。我的猜测是你覆盖它确实注册了 CORSFilter。使用扫描工具时不会自动注册吗?
  • 谢谢你!好的。那很有意思。然后正确扫描我的网络服务中的其他内容.. '@'GET、POST 等之前的路径、'@'JsonIgnore 等。“扫描设施”是什么意思?我在哪里可以看到已经扫描了哪些课程?如果有帮助,我正在使用 Netbeans 8 ...
  • @user3601578 @peeskillet 想说的是,如果您将扩展的 Application 类留空,那么 Jersey 应该自动扫描您的项目并注册所有带有 @Path 和 @Provider 注释的类。不知道是不是真的,没试过这种方法。根据我在服务器启动期间的记忆,Jersey 应该打印以记录所有已注册的组件
  • 谢谢大家。因为尽管我学到了很多关于球衣 1 的知识,但它并没有那样工作。最终,我只是简单地将这个 tomcat 8 有效过滤器添加到我的 web.xml CorsFilterorg.apache.catalina.filters.CorsFilter类> cors.allowed.origins*CorsFilter/*
【解决方案2】:

谢谢大家。尽管我学到了很多关于球衣 1 的知识,但它并没有那样工作。最终,我只是简单地将这个 tomcat 8 有效过滤器添加到我的 web.xml

    <filter>
       <filter-name>CorsFilter</filter-name>
       <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
       <init-param>
           <param-name>cors.allowed.origins</param-name>
           <param-value>*</param-value>
       </init-param>
   </filter>
   <filter-mapping>
       <filter-name>CorsFilter</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>

【讨论】:

    猜你喜欢
    • 2016-01-01
    • 2019-01-12
    • 2016-11-10
    • 2016-09-24
    • 2016-05-30
    • 2018-09-20
    • 1970-01-01
    • 2018-10-06
    相关资源
    最近更新 更多