Web 过滤器 URI 选择错误
Web filter URI selection is wrong
我有一个网络过滤器,它在 web.xml 中定义为
<filter-mapping>
<filter-name>ABCFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我正在使用此过滤器记录一些详细信息。其中一个细节是网页的 URI。
当我浏览 index.html(或任何 html 页面时),记录的 URI 不是该页面的 URI,而是我在该页面上使用的图像的 URI。
例如,如果 URI 是“/index.html”;日志文件中的 URI 是 "images/banner.gif".
当我将 url-pattern 指定为“*.html”时,它正在计算正确的 uri,但将 url-pattern 指定为 /*,它会记录错误的数据。
我们将不胜感激任何类型的输入。
/*
涵盖所有请求。这包括对静态资源的请求,例如 HTML 页面引用的 CSS/JS/image 文件。您似乎没有意识到网页是这样工作的。您似乎以某种方式期望所有必要的资源都在与网页请求相同的响应中提供。这不是真的。 HTML 这样不行。
您需要修改过滤器的 URL 模式,使其只匹配感兴趣的 URL。例如,如果所有这些 URL 的共同模式是它们以 .jsp
结束,那么只需使用 *.jsp
作为 URL 模式。
<url-pattern>*.jsp</url-pattern>
请注意,您可以在单个映射中指定多个 <url-pattern>
条目。所以下面也是有效的:
<filter-mapping>
...
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.html</url-pattern>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
如果没有特定的通用模式,例如因为您使用 URL 重写来剥离扩展名并且没有公共文件夹,那么您应该将所有静态资源(如 CSS/JS/image 文件移动到公共文件夹中,例如/resources/
,然后在过滤器中添加一个检查以从业务作业中排除该路径。
<url-pattern>/*</url-pattern>
String resourceURI = request.getContextPath() + "/resources/";
boolean resourceRequest = request.getRequestURI().startsWith(resourceURI);
if (!resourceRequest) {
// Log request.
}
chain.doFilter(request, response);
无法将 "exclude" URL 模式添加到映射中。
我有一个网络过滤器,它在 web.xml 中定义为
<filter-mapping>
<filter-name>ABCFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我正在使用此过滤器记录一些详细信息。其中一个细节是网页的 URI。 当我浏览 index.html(或任何 html 页面时),记录的 URI 不是该页面的 URI,而是我在该页面上使用的图像的 URI。
例如,如果 URI 是“/index.html”;日志文件中的 URI 是 "images/banner.gif".
当我将 url-pattern 指定为“*.html”时,它正在计算正确的 uri,但将 url-pattern 指定为 /*,它会记录错误的数据。
我们将不胜感激任何类型的输入。
/*
涵盖所有请求。这包括对静态资源的请求,例如 HTML 页面引用的 CSS/JS/image 文件。您似乎没有意识到网页是这样工作的。您似乎以某种方式期望所有必要的资源都在与网页请求相同的响应中提供。这不是真的。 HTML 这样不行。
您需要修改过滤器的 URL 模式,使其只匹配感兴趣的 URL。例如,如果所有这些 URL 的共同模式是它们以 .jsp
结束,那么只需使用 *.jsp
作为 URL 模式。
<url-pattern>*.jsp</url-pattern>
请注意,您可以在单个映射中指定多个 <url-pattern>
条目。所以下面也是有效的:
<filter-mapping>
...
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.html</url-pattern>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
如果没有特定的通用模式,例如因为您使用 URL 重写来剥离扩展名并且没有公共文件夹,那么您应该将所有静态资源(如 CSS/JS/image 文件移动到公共文件夹中,例如/resources/
,然后在过滤器中添加一个检查以从业务作业中排除该路径。
<url-pattern>/*</url-pattern>
String resourceURI = request.getContextPath() + "/resources/";
boolean resourceRequest = request.getRequestURI().startsWith(resourceURI);
if (!resourceRequest) {
// Log request.
}
chain.doFilter(request, response);
无法将 "exclude" URL 模式添加到映射中。