servlets - 从另一个 servlet 调用 servlet 过滤器
问题描述
我正在开发 CMS。
我的代码doGet()
在 url 调用的 servlet 函数内"/market"
。我想要一个HttpServletRequestWrapper
可以通过为 url 设置的所有过滤器"/page"
。
我希望这些过滤器会更新请求,以便注释处理器稍后可以注入具有正确值的依赖项。
我在 Tomcat 服务器中,所以我应该能够转换到正确的特殊对象,并且我不必与其他服务器兼容。
一个相关的问题是,使用req.getRequestDispatcher(path).forward(requestWrapper, responseWrapper);
, 我期望调用过滤器。他们应该吗?javadoc 说:
此方法允许一个 servlet 对请求进行初步处理
解决方案
默认情况下,过滤器仅映射在REQUEST
调度程序上。下面的过滤器映射示例
<filter-mapping>
<filter-name>yourFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
隐式等价于
<filter-mapping>
<filter-name>yourFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
这意味着,过滤器仅在“原始”传入请求时触发,而不是在转发请求时触发。
还有另外三个调度程序FORWARD
:INCLUDE
和ERROR
。RequestDispatcher#forward()
触发FORWARD
调度程序。如果你想让你的过滤器也钩住它,那么只需添加它:
<filter-mapping>
<filter-name>yourFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
请注意,您需要在REQUEST
此处明确指定调度程序,否则它将假定您完全覆盖它并且只对FORWARD
调度程序感兴趣。
在过滤器内部,如果您想区分 aREQUEST
和FORWARD
,那么您可以通过确定是否存在以RequestDispatcher#FORWARD_REQUEST_URI
String forwardRequestURI = (String) request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);
if (forwardRequestURI != null) {
// Forward was triggered on the given URI.
}
推荐阅读
- java - 并发请求的 repo 类线程安全吗?- 弹簧靴
- visual-studio-code - 控件标记/悬停时查看控制器源
- sql-server - 如何在不使用任何第三方工具的情况下连接到 SQL Server 2016/2017 中的 git
- sql - 使用查询小计
- php - 如何将 get_results() 中的搜索查询获取到我的帖子的 Wp_Query?
- google-sheets - IF OR 与公式数组
- javascript - 通过 javascript 对象访问数据并将其打印在 html 页面上
- python - Python:将 json 结果更改为 data.frame
- android - 发布版本上的 INSTALL_PARSE_FAILED_NO_CERTIFICATES
- c# - 有没有办法在 c# 中安装的 Windows 键盘布局之间切换?