带有Jersey和嵌入式Jetty的CrossOriginFilter

用户名

我知道这个问题但他们没有回答和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();
        }    

我怎么了 我没有收到任何错误消息!

编辑

另外,以下教程无法正常工作。无论是使用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响应标头。而且这仅应发生在浏览器发出的跨源请求上。

根据CORS协议,Jersey过滤器起作用的原因可能是由于未正确实施。它可能只是一个懒惰的版本,其中为所有请求添加了标头。这个答案中,我最初还实现了相同的“惰性” CORS支持,但是如果您查看UPDATE,我将说明应如何实现。如果您想了解有关CORS的更多信息,那UPDATE是一个很好的阅读。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有Appache CXF和嵌入式Jetty的Websocket上的SOAP

带有嵌入式 Jetty 和 Spring Boot 的目录列表

带有HK2定位器的嵌入式Jetty上的Jersey未加载ResourceConfig

嵌入式Jetty和正常关机

带有Jetty env文件的嵌入式Jetty无法正常工作

使用嵌入式Jetty和jersey建立Web应用程序,并进行请求分派

带有嵌入式HTML和验证的XML模式

带有嵌入式码头的招摇

带有负数的嵌入式除法

Spring 3.1 WebApplicationInitializer和嵌入式Jetty 8 AnnotationConfiguration

使用嵌入式Jetty和Tapestry进行日志记录

将现有 WAR 部署到嵌入式 Jetty

具有嵌入式Jetty的异步Servlet

创建带有嵌入式图像和PDF附件的HTML邮件

在特定的经度和纬度上显示带有标记的嵌入式Google Map iframe

php 用于打包任何带有嵌入式 javascript 和 css 的 URL?

读取带有嵌入式双引号和逗号的CSV文件

curl:发送带有嵌入式图像和附件的html电子邮件

使用Jetty嵌入式容器时,ServletContextHandler.setResourceBase和ResourceHandler.setResourceBase有什么区别?

将嵌入式Jetty&Jersey war部署到jetty9,只能看到静态文件?

嵌入式Jetty服务器

Jetty BadMessage嵌入式WebSocket Servlet

带有表单域的PDF文档的嵌入式签名

如何调试带有 500 错误的嵌入式 javascript

带有Formik的嵌入式复选框标签

带有嵌入式 ActiveMQ Broker 的 Spring Boot WebSocket

带有Jenkins的嵌入式Linux开发模型

打印带有嵌入式图像的Jira问题?

带有嵌入式ElementCollections的JPA CriteriaBuilder