gpt4 book ai didi

jetty - 带有嵌入式 Jetty 的跨源过滤器

转载 作者:行者123 更新时间:2023-12-01 07:18:37 25 4
gpt4 key购买 nike

我正在尝试让 CrossOriginFilter 与几个嵌入式 Jetty 服务器一起工作,这两个服务器都在我们的内部网络上运行。两者都在运行 servlet,但我需要服务器 A 的网页才能发布到服务器 B 的 servlet。我想我需要将 ACCESS_CONTROL_ALLOW_ORIGIN 添加到 CrossOriginFilter 但要找出如何使用没有 web.xml 的嵌入式 Jetty 实例来做到这一点并不容易。尝试访问服务器 b 的 serlvets 时,我在浏览器中收到以下错误消息

No 'Access-Control-Allow-Origin' header is present on the requested resource

我使用 angularjs 在 Controller 中发布到其他服务器的 servlet。

这是其中一台服务器的代码(两者几乎相同)
Server server = new Server(httpPort);

ResourceHandler resource_handler = new ResourceHandler();
resource_handler.setDirectoriesListed(true);
resource_handler.setWelcomeFiles(new String[] { "index.html" });
resource_handler.setResourceBase("./http/");

ServletHandler handler = new ServletHandler();
handler.addServletWithMapping(ServerPageRoot.class, "/servlet/*");

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");

handler.addFilter(holder );

HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resource_handler, handler,new DefaultHandler() });
server.setHandler(handlers);
server.start();

最佳答案

几点:

  • 不要使用 ServletHandler裸体那样。 ServletHandler是一个内部类 ServletContextHandler使用。
  • ServletContextHandler是什么提供了所需的ServletContext您正在使用的各种 servlet 和过滤器的对象和状态。
  • ServletContextHandler还为整体上下文路径声明提供了一个位置
  • ServletContextHandler也是欢迎文件声明的地方。
  • 不要使用 ResourceHandler ,当您有 DefaultServlet可用,它的功能更强大,功能更丰富。

  • 例子:

    Server server = new Server(httpPort);

    // Setup the context for servlets
    ServletContextHandler context = new ServletContextHandler();
    // Set the context for all filters and servlets
    // Required for the internal servlet & filter ServletContext to be sane
    context.setContextPath("/");
    // The servlet context is what holds the welcome list
    // (not the ResourceHandler or DefaultServlet)
    context.setWelcomeFiles(new String[] { "index.html" });

    // Add a servlet
    context.addServlet(ServerPageRoot.class,"/servlet/*");

    // Add the filter, and then use the provided FilterHolder to configure it
    FilterHolder cors = context.addFilter(CrossOriginFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
    cors.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
    cors.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, "*");
    cors.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,POST,HEAD");
    cors.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "X-Requested-With,Content-Type,Accept,Origin");

    // Use a DefaultServlet to serve static files.
    // Alternate Holder technique, prepare then add.
    // DefaultServlet should be named 'default'
    ServletHolder def = new ServletHolder("default", DefaultServlet.class);
    def.setInitParameter("resourceBase","./http/");
    def.setInitParameter("dirAllowed","false");
    context.addServlet(def,"/");

    // Create the server level handler list.
    HandlerList handlers = new HandlerList();
    // Make sure DefaultHandler is last (for error handling reasons)
    handlers.setHandlers(new Handler[] { context, new DefaultHandler() });

    server.setHandler(handlers);
    server.start();

    关于jetty - 带有嵌入式 Jetty 的跨源过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28190198/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com