欢迎文件不支持 Servlet-Filter

Posted

技术标签:

【中文标题】欢迎文件不支持 Servlet-Filter【英文标题】:Servlet-Filter is not honoured for welcome file 【发布时间】:2013-06-11 22:50:19 【问题描述】:

我正在使用过滤器生成对网络爬虫可见的动态内容 (https://developers.google.com/webmasters/ajax-crawling/docs/specification)。如果传入的 url 包含路径 (http://www.unclestock.com/app.jsp#!s=GOOG),则此过滤器工作正常。如果传入的 url 只包含我的域(和一个片段),比如 http://www.unclestock.com#!s=GOOG,则返回欢迎文件 (app.jsp),但不支持过滤器。

我的 web.xml 包含以下过滤器映射:

<filter-mapping>
 <filter-name>crawler</filter-name>
 <url-pattern>/app.jsp</url-pattern>
</filter-mapping>

<welcome-file-list>
 <welcome-file>app.jsp</welcome-file>
</welcome-file-list>

我尝试改用 index.html 欢迎文件,该文件重定向到 app.jsp。然后执行过滤器。但是,这并不能解决我的问题:爬虫不遵循客户端重定向(这是想法),并且使用服务器端重定向,我会丢失我的 url 片段(我也需要)。

您有什么替代解决方案吗?

我正在使用 Google Appengine。

【问题讨论】:

【参考方案1】:

我通过使用一个执行 RequestDispatcher 转发的欢迎 servlet 解决了这个问题。请注意,必须将调度程序 FORWARD 添加到过滤器映射中,以便过滤器在转发期间工作。

web.xml:
<filter-mapping>
  <filter-name>crawler</filter-name>
  <url-pattern>*.jsp</url-pattern>
  <dispatcher>REQUEST</dispatcher> 
  <dispatcher>FORWARD</dispatcher>
</filter-mapping>

<welcome-file-list>
  <welcome-file>welcome</welcome-file>
</welcome-file-list>

<servlet>
  <servlet-name>welcome</servlet-name>
  <servlet-class>Welcome</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>welcome</servlet-name>
  <url-pattern>/welcome</url-pattern>
</servlet-mapping>

Welcome.java:
public class Welcome extends RemoteServiceServlet 
  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
    RequestDispatcher rd = req.getRequestDispatcher("app.jsp");
    rd.forward(req, resp);
  

【讨论】:

以上是关于欢迎文件不支持 Servlet-Filter的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 servlet-filter 的 url-mapping 中没有条件吗

选择的文件中包含不支持的格式

配置的日志记录驱动程序不支持读取:Docker

为啥说稳定版不支持ROOT权限,怎样解决。谢谢。

eggjs中egg-mysql不支持mysql集群,代码修改为支持集群

eggjs中egg-mysql不支持mysql集群,代码修改为支持集群