奇怪的 Java Servlet 过滤器映射行为

Posted

技术标签:

【中文标题】奇怪的 Java Servlet 过滤器映射行为【英文标题】:Strange Java Servlet Filter-Mapping Behaviour 【发布时间】:2012-03-17 03:54:31 【问题描述】:

我正在使用带有 Google App Engine 插件和 Guice 的 Eclipse IDE。在开发服务器上运行,我在 web.xml 和 guice MyServletModule extends ServletModule 中尝试了这两种方法:

<url-pattern>/user/*</url-pattern>

filter("/user/*").through(LoginFilter.class); 

两者似乎都适用

http://www.domain.com/user/

但是......似乎都不适用于:

http://www.domain.com/user/myaccount.html

知道为什么吗?根据文档,/user/* 应该适用于两者,对吧?

...我怀疑它与 itaself 文件有关,因为我似乎也无法过滤 "*.html"

编辑已解决。叹息......我在 GAE/J 文档中发现了这个花絮: "Note: Filters are not invoked on static assets, even if the path matches a filter-mapping pattern. Static files are served directly to the browser."

【问题讨论】:

【参考方案1】:

我在 GAE/J 文档中发现了这个花絮:

Note: Filters are not invoked on static assets, even if the path matches a filter-mapping pattern. Static files are served directly to the browser.

尽管所有 Java Servlet 文档都说您可以做到,但在 GAE/J 中却无法做到。

【讨论】:

【参考方案2】:

我发现这种模式有效:

<security-constraint>
    <web-resource-collection>
        <url-pattern>/myFile.html</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

.. 所以如果你指定一个文件,它可能会被过滤!

【讨论】:

谢谢。是的,这些本地 GAE 约束确实有效,但我需要添加对存储的会话数据的自定义检查,我在过滤器中执行此操作,而约束没有给我。我只是把我的静态 *.html 变成了 *.jsp。

以上是关于奇怪的 Java Servlet 过滤器映射行为的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.IllegalArgumentException:过滤器映射必须指定 <url-pattern> 或 <servlet-name>

使用简单的正则表达式映射Java Servlet的任何方式? [复制]

java中的Servlet/过滤器特定异常处理

java中的Servlet/过滤器特定异常处理

如何以编程方式添加 servlet 过滤器?

如何在 Jetty 中的 /* 上映射 servlet 过滤器?