我有一个在嵌入式码头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/