在 servlet 过滤器中,如何确定哪个 servlet 与 URL 匹配?

Posted

技术标签:

【中文标题】在 servlet 过滤器中,如何确定哪个 servlet 与 URL 匹配?【英文标题】:How can you determine which servlet matches a URL when inside a servlet filter? 【发布时间】:2021-04-29 19:47:19 【问题描述】:

我正在运行一个 Jetty Web 服务器,并且我有一个通用的 servlet 过滤器来处理异常。作为其中的一部分,我想记录有关哪些 servlet 导致异常的聚合指标。有没有办法找出 web.xml 中定义的 servlet 与当前请求的 servlet 路径匹配?

【问题讨论】:

异常应该就是这样,异常。您检查日志,查看堆栈跟踪以识别引发异常的 servlet,然后修复代码使其不再发生。您是否有很多例外情况想要构建关于它们的聚合指标?为什么?你想做什么? 【参考方案1】:

我有一个通用的 servlet 过滤器来处理异常

我认为你的意思是你的过滤器直接扩展javax.servlet.GenericFilter

有没有办法找出 web.xml 中定义的哪些 servlet 与当前请求的 servlet 路径匹配?

在任何给定的 servlet 上下文中,映射到给定 servlet 路径的 servlet 不应超过一个,因此在任何给定情况下,您都在寻找一个 servlet,而不是多个。

据我所知或所知,GenericFilter 和通用的ServletRequests 和ServletResponses 不能提供访问您所需要的信息的好方法。但是,如果您将请求转换为 HttpServletRequest,那么您可以获得它的 HttpServletMapping(从 Servlet 4.0 / Java EE 8 开始) ,其中包含在 webapp 的部署描述符中声明的 servlet 名称以及其他信息。或者HttpServletRequest也可以直接提供servlet路径。

但是,如果您正在考虑转换请求,那么您最好让您的过滤器扩展 javax.servlet.http.HttpFilter,这将为您提供类型安全的访问。这本身就是GenericFilter 的子类,因此执行这样的重构可能并不难。

【讨论】:

以上是关于在 servlet 过滤器中,如何确定哪个 servlet 与 URL 匹配?的主要内容,如果未能解决你的问题,请参考以下文章

jsp\java如何编写过滤器过滤特殊字符

eclipse web项目的编码过滤器,统一设置成UTF-8

过滤器的使用

过滤器(Filter)

在 servlet 过滤器中设置托管 Bean 的值。 [关闭]

javaWeb核心之servlet