java - 如何让 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
页面上工作?
解决方案
将为您的配置中的AuthFilter
两个请求执行。
例子:
- 您发出 GET 请求
/path/to/content/
- 此请求的匹配 servlet 是
DefaultServlet
- 被
AuthFilter
调用,然后是DefaultServlet
(假设您允许链接工作) - 检测到这
DefaultServlet
是一个目录请求(这dirAllowed
是错误的),因此它使用欢迎列表并发出重定向响应(因为您已redirectWelcome
设置为 true)。(此行为假设/path/to/content/welcome.html
实际存在,否则为 404 响应)
302 Found HTTP/1.1
Location: /path/to/content/welcome.html
- 客户端遵循重定向并发出 GET 请求
/path/to/content/welcome.html
- 此请求的匹配 servlet 是
DefaultServlet
- 被
AuthFilter
调用,然后是DefaultServlet
(假设您允许链接工作) - 检测到这
DefaultServlet
是一个文件资源并返回其内容。
你AuthFilter
被叫了两次,一次是第 3 步,一次是第 7 步。
推荐阅读
- python - 确保我在每个请求中得到的推文在 twitter API 中是不同的?
- python - 正则表达式忽略特殊字符,但我需要连续四位数字,中间没有特殊字符
- date - Grails dataBinding 在默认编组 grails 日期上不起作用
- winforms - 如何使用 CefSharp winforms 接收拖动移动和拖放事件
- android - 尝试从图像视图导航到片段时应用程序崩溃
- c - 单纯形算法的数值稳定性
- sql - 按 ID/季度发行的 SQL 组
- docker - Docker 撰写卷容器附件的问题
- string - 批处理文件 - 名称
- javascript - 无法将属性设置为 null