Servlet URL 映射和过滤器映射——无法让两者一起工作

问题描述 投票:0回答:1

在我的 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 响应?

servlets servlet-filters servlet-mapping
1个回答
0
投票

没有简单的方法可以解决这个问题,因为过滤器映射似乎总是优先于 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 与每个数组的内容进行匹配。虽然有点乱,但这是我能做的最好的了。

© www.soinside.com 2019 - 2024. All rights reserved.