未在 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,但我想为您希望过滤器应用到的文件添加一个 &lt;exclude&gt; 就可以了(这些文件将由 默认 servlet 提供服务;我猜想他们会因此被收取不同的费用)

【讨论】:

你是对的。在 appengine-web.xmlstatic-files/exclude 中指定目标 .html 文件有帮助。非常感谢! 糟糕,让我收回我的话。经过一些测试,结果证明 GAE 无法提供 html。它说WARNING: Can not serve /AdminPanel.html directly. You need to include it in &lt;static-files&gt; in your appengine-web.xml.【参考方案2】:

我还没有研究为什么,但是当我遇到这个时(虽然很匆忙),有效的方法是删除 index.html 并使我的 &lt;welcome-file&gt; 成为 .jsp

【讨论】:

非常感谢,戴夫。你的解决方案对我有用。尽管@thomas 关于未调用过滤器的原因是正确的,但它对我不起作用,因为 GAE 无法提供给定的静态文件。 只是想知道这里...任何人都知道,如果在 servlet 容器之外处理静态文件,这是 Appengine 的特性,还是任何 java Servlet 都会这样?

以上是关于未在 GWT 模块的 .html 文件上调用 Servlet 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

GWT 内容未在 centOS 7.5 上显示

GWT SE友好的应用程序

GWT:在另一个模块中调用 RPC 服务

从 html 脚本标签调用 GWT Java 函数

iOS - WKURLSchemeHandler 未在自定义方案上调用

GWT 中的多个入口点