未在 GWT 模块的 .html 文件上调用 Servlet 过滤器
Posted
技术标签:
【中文标题】未在 GWT 模块的 .html 文件上调用 Servlet 过滤器【英文标题】:Servlet filter isn't being invoked on .html file of GWT module 【发布时间】:2011-12-06 20:12:57 【问题描述】:也许我只是缺少一些基本知识,但我无法弄清楚为什么 servlet 过滤器无法捕获主 GWT 模块的 .html 文件上的 GET 请求。
我的过滤器在 web.xml 中定义为
<filter>
<filter-name>GaeAuthFilter</filter-name>
<filter-class>com.test.GaeAuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>GaeAuthFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
当我在开发模式下启动应用程序时,它会在浏览器中打开http://127.0.0.1:8888/AdminPanel.html?gwt.codesvr=127.0.0.1:9997,但过滤器中没有任何内容:(
我需要这个的原因是我不希望我的身份验证在 RequestFactory ajax 调用中失败,因为它看起来很丑,因为它首先加载 html,然后重定向到 Google 帐户登录页面。我想在访问 html 页面时捕获未经身份验证的用户,这样浏览器甚至不会加载网站的受保护区域。
作为替代方案,我尝试使用 web.xml 的“安全约束”部分,但它也忽略了对 .html 文件的调用。
请指教。
谢谢!
【问题讨论】:
【参考方案1】:来自the AppEngine documentation:
注意:静态文件,即逐字提供给用户的文件,例如图像、CSS 或 javascript,与部署描述符中提到的路径分开处理。无论部署描述符中的 servlet 和过滤器映射如何,对与 WAR 中被视为静态文件的文件的路径匹配的 URL 路径请求都将为该文件提供服务。您可以使用appengine-web.xml 文件从那些被视为静态文件的文件中排除文件。
我不使用 AppEngine,但我想为您希望过滤器应用到的文件添加一个 <exclude>
就可以了(这些文件将由 默认 servlet 提供服务;我猜想他们会因此被收取不同的费用)
【讨论】:
你是对的。在 appengine-web.xml 的 static-files/exclude 中指定目标 .html 文件有帮助。非常感谢! 糟糕,让我收回我的话。经过一些测试,结果证明 GAE 无法提供 html。它说WARNING: Can not serve /AdminPanel.html directly. You need to include it in <static-files> in your appengine-web.xml.
【参考方案2】:
我还没有研究为什么,但是当我遇到这个时(虽然很匆忙),有效的方法是删除 index.html
并使我的 <welcome-file>
成为 .jsp
【讨论】:
非常感谢,戴夫。你的解决方案对我有用。尽管@thomas 关于未调用过滤器的原因是正确的,但它对我不起作用,因为 GAE 无法提供给定的静态文件。 只是想知道这里...任何人都知道,如果在 servlet 容器之外处理静态文件,这是 Appengine 的特性,还是任何 java Servlet 都会这样?以上是关于未在 GWT 模块的 .html 文件上调用 Servlet 过滤器的主要内容,如果未能解决你的问题,请参考以下文章