在我的 web.xml 中,我有一个 servlet 映射:
<servlet>
<servlet-name>My Servlet</servlet-name>
<servlet-class>servlets.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>My Servlet</servlet-name>
<url-pattern>/dir/*</url-pattern>
</servlet-mapping>
我还有一个过滤器:
<filter>
<filter-name>My Filter</filter-name>
<filter-class>filters.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>My Filter</filter-name>
<url-pattern>*.data</url-pattern>
</filter-mapping>
如果我访问
/dir
或 /dir/foo
,servlet 会做出响应。如果我访问 /somewhere/file.data
,过滤器会过滤响应。如果我访问 /dir/foo.data
,我只会收到 404 错误。
我尝试颠倒 web.xml 文件中 servlet 和过滤器的顺序,但这没有什么区别。看来我可以让 servlet 响应,或者让过滤器过滤响应,但不能两者兼而有之。
谁能告诉我该怎么做才能让 servlet 响应并让过滤器处理 servlet 响应?
没有简单的方法可以解决这个问题,因为过滤器映射似乎总是优先于 servlet 映射。 (我在 servlet 规范中看不到任何强制执行此操作的内容,但这就是它的工作方式。)我找到的唯一解决方案是完全摆脱过滤器并将其功能合并到 servlet 中。
我现在有一个 servlet,它可以响应
/dir/*
和 *.data
。它检查请求 URI,如果它以 /dir/
开头,它会动态生成响应,否则它只处理相应的文件。然后,如果 URI 以 .data
结尾,它将以与过滤器相同的方式预处理响应。
缺点是这会导致维护问题,因为 servlet 需要知道它在
web.xml
文件中配置为响应哪些模式。为了最大限度地减少问题,servlet 映射现在如下所示:
<servlet>
<servlet-name>My Servlet</servlet-name>
<servlet-class>servlets.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>My Servlet</servlet-name>
<!--
If the patterns below are changed, the "prefixes" and
"suffixes" list in the servlet source code need to be
updated to match, and the servlet needs to be recompiled.
-->
<url-pattern>/dir/*</url-pattern>
<url-pattern>*.data</url-pattern>
</servlet-mapping>
在 servlet 中我有这个:
public static final String[] prefixes = new String[] {
"/dir/"
};
public static final String[] suffixes = new String[] {
".data"
};
因此 Servlet 可以将 URI 与每个数组的内容进行匹配。虽然有点乱,但这是我能做的最好的了。