首页 > 解决方案 > 如何让 ServletFilter 处理嵌入式 Jetty 中的欢迎文件?

问题描述

我有一个在嵌入式码头 9.4.12 上运行的应用程序。在ServletContextHandler将处理程序设置为对象之前,对象用于设置欢迎文件以及添加 servlet 过滤器Server。添加的过滤器列表包括对传入请求执行身份验证的某些过滤器。但是,这些过滤器不会在欢迎页面上触发,但它们确实在其他端点上工作。

相关服务器初始化代码:

ServletContextHandler root = new ServletContextHandler(ServletContextHandler.SESSIONS);
root.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
root.setInitParameter("org.eclipse.jetty.servlet.Default.redirectWelcome", "true");
root.setWelcomeFiles(new String[]{"welcome.html"});
FilterHolder filterHolder = new FilterHolder(
   new AuthFilter());
root.addFilter(filterHolder, "/*", null);
HandlerList handlerList = new HandlerList();
      handlerList.setHandlers(
          new Handler[]{root)
          }
      );
 server.setHandler(handlerList);

有没有办法让AuthFilter这里的 servlet 过滤器在welcome.html页面上工作?

标签: javaservletsjettyservlet-filtersembedded-jetty

解决方案


将为您的配置中的AuthFilter两个请求执行。

例子:

  1. 您发出 GET 请求/path/to/content/
  2. 此请求的匹配 servlet 是DefaultServlet
  3. AuthFilter调用,然后是DefaultServlet(假设您允许链接工作)
  4. 检测到这DefaultServlet是一个目录请求(这dirAllowed是错误的),因此它使用欢迎列表并发出重定向响应(因为您已redirectWelcome设置为 true)。(此行为假设/path/to/content/welcome.html实际存在,否则为 404 响应)
302 Found HTTP/1.1
Location: /path/to/content/welcome.html
  1. 客户端遵循重定向并发出 GET 请求/path/to/content/welcome.html
  2. 此请求的匹配 servlet 是DefaultServlet
  3. AuthFilter调用,然后是DefaultServlet(假设您允许链接工作)
  4. 检测到这DefaultServlet是一个文件资源并返回其内容。

AuthFilter被叫了两次,一次是第 3 步,一次是第 7 步。


推荐阅读