【问题标题】:CrossOriginFilter with Jersey and embedded Jetty带有 Jersey 和嵌入式 Jetty 的 CrossOriginFilter
【发布时间】:2019-03-26 16:23:18
【问题描述】:

我知道 this questionthat on 但是 4 年前他们没有得到答复和询问。此外,没有一个答案对我有用。 我无法将 crossOriginFilter 添加到我的嵌入式码头服务器。

我的绒球

    <!-- Jetty -->
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-server</artifactId>
        <version>9.2.11.v20150529</version>
    </dependency>
   <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlet</artifactId>
        <version>9.2.11.v20150529</version>
    </dependency>   
   <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlets</artifactId>
        <version>9.2.11.v20150529</version>
    </dependency> 

我的代码 - 不幸的是,我在响应中没有得到任何 Header 字段!

        ServletContextHandler dynamicResourceContext = new ServletContextHandler();
        dynamicResourceContext.setContextPath("/rest");

        FilterHolder holder = new FilterHolder(CrossOriginFilter.class);
        holder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
        holder.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, "*");
        holder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,POST,HEAD");
        holder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "X-Requested-With,Content-Type,Accept,Origin");
        dynamicResourceContext.addFilter(holder, "/*", EnumSet.of(DispatcherType.REQUEST));

        ServletContextHandler staticResourceContext = new ServletContextHandler();
        staticResourceContext.setContextPath("/resources");
        DefaultServlet defaultServlet = new DefaultServlet();
        ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
        holderPwd.setInitParameter("resourceBase", "./src/webapp/");


        staticResourceContext.addServlet(holderPwd, "/*");

        HandlerList handlers = new HandlerList();
        handlers.addHandler(dynamicResourceContext);
        handlers.addHandler(staticResourceContext);

        server = new Server(port);
        server.setHandler(handlers);
        // set logging to console
        StdErrLog logger = new StdErrLog();
        logger.setDebugEnabled(webserverLogging);
        Log.setLog(logger);

        ServletHolder jerseyServlet = dynamicResourceContext
                .addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*");

        jerseyServlet.setInitOrder(0);


        // Tells the Jersey Servlet which REST service/class to load.
        jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", getMyClasses());


        try {
            server.start();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // server.destroy();
        }    

我做错了什么?我没有收到任何错误消息!

编辑

以下tutorial 也不起作用。无论是 Postman 还是 chrome,我都没有看到额外的响应头条目。 响应如下所示:

HTTP/1.1 200 OK
Date: Tue, 26 Mar 2019 19:41:36 GMT
Content-Length: 0
Server: Jetty(9.4.15.v20190215)

编辑 我能够使用资源配置创建标题字段,但我仍然无法使用 CrossOriginFilter 创建它们。

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);

context.setContextPath("/"); 
Server jettyServer = new Server(9998);

jettyServer.setHandler(context);


ResourceConfig webapiResourceConfig = new ResourceConfig();
webapiResourceConfig.register(CorsFilter.class);


ServletHolder jerseyServlet  = new ServletHolder(new ServletContainer(webapiResourceConfig));
context.addServlet(jerseyServlet, "/*");
        //context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*");

jerseyServlet.setInitOrder(0);

jerseyServlet.setInitParameter( "jersey.config.server.provider.classnames",MyServerConfig.class.getCanonicalName());

【问题讨论】:

  • 您不应该在 Postman 中看到标题,因为 Postman 不需要 CORS 支持。在 Chrome 中,只有在您实际发出跨源请求时才能看到它们。如果过滤器实现正确,它应该只在存在 Origin 请求标头时吐出 CORS 响应标头。这应该只发生在从浏览器发出的跨源请求上。
  • 你是对的:如果我在请求头中设置原点,那么我会得到所需的响应
  • 请发表您的评论作为答案 - 我会接受!

标签: jetty jersey-2.0 embedded-jetty


【解决方案1】:

您不应该在 Postman 中看到标题,因为 Postman 不需要 CORS 支持。在 Chrome(或任何浏览器)中,只有在实际发出跨源请求时才能看到它们。如果过滤器实现正确,它应该只在存在 Origin 请求标头时才吐出 CORS 响应标头。这应该只发生在从浏览器发出的跨源请求上。

根据 CORS 协议,您的 Jersey 过滤器起作用的原因可能是它没有正确实现;它可能只是一个惰性版本,其中为所有请求添加了标头。在this answer 中,我最初也实现了相同的“惰性”CORS 支持,但如果您查看更新,我会解释它应该如何实现。如果您想了解更多关于 CORS 的信息,那 UPDATE 是一本不错的读物。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 2015-02-25
  • 2022-07-08
相关资源
最近更新 更多