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

相关服务器初始化代码:

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页面上工作?

最佳答案

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

例:


您向/path/to/content/发出GET请求
此请求的匹配servlet是DefaultServlet
调用AuthFilter,然后调用DefaultServlet(假设您允许链接起作用)
DefaultServlet检测到这是一个目录请求(并且dirAllowed为false),因此它使用欢迎列表并发出重定向响应(因为redirectWelcome设置为true)。 (此行为假定/path/to/content/welcome.html实际上存在,否则为404响应)


302 Found HTTP/1.1
Location: /path/to/content/welcome.html



客户端遵循重定向并向/path/to/content/welcome.html发出GET请求
此请求的匹配servlet是DefaultServlet
调用AuthFilter,然后调用DefaultServlet(假设您允许链接起作用)
DefaultServlet检测到这是文件资源并返回其内容。


您的AuthFilter被调用了两次,一次是针对步骤3,另一次是针对步骤7。

关于java - 如何使ServletFilter在嵌入式Jetty中的欢迎文件上工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60938561/

10-12 15:56