Java Jersey 1.8,添加CORS过滤器不起作用

Java Jersey 1.8, adding CORS Filter does not work

本文关键字:CORS 过滤器 不起作用 添加 Jersey Java      更新时间:2023-09-26

我正在尝试将 CORS 过滤器添加到我的 Jersey 1.8 Web 服务中。

    @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从这里():

    @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 标头。我在这里错过了什么?

您的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);
    }
}

有关更多信息,请参阅泽西岛文档

谢谢大家。 尽管我对泽西1号了解了很多,但它并没有那样工作。 最终,我最终只是简单地将这个Tomcat 8有效过滤器添加到我的网站上.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>