通过google-app-engine中的web.xml重定向

时间:2012-11-26 10:58:46

标签: google-app-engine web.xml

迁移到新的HRD商店后,我想将请求重定向到旧的应用程序到新的HRD应用程序。我知道我应该让Google迁移工具创建一个别名,但是因为我迁移了我的应用程序的中间副本(因为迁移数据库导致的噩梦),这不是一个选项。

我的计划是使用一个执行HTTP 301(HttpServletResponse.SC_MOVED_PERMANENTLY)重定向的servlet,并在web.xml中使用带/ *的servlet-mapping。 这在本地工作,但在真正的应用程序引擎上,它没有。似乎app-engine没有正确识别的URL模式。到目前为止,我有:

  <servlet-mapping>
    <servlet-name>RedirectToHRD</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>RedirectToHRD</servlet-name>
    <url-pattern>/*</url-pattern>
    <url-pattern>/*/*</url-pattern>
    <url-pattern>/*/*/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>RedirectToHRD</servlet-name>
    <url-pattern>*.jsp</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>RedirectToHRD</servlet-name>
    <url-pattern>index.jsp</url-pattern>
  </servlet-mapping>

我知道它看起来很疯狂,但我很绝望。只有'/'和'index.jsp'通过RedirectToHRD servlet重定向。对于其他页面(JSP或其他任何),这不起作用。日志文件很高兴地表明页面已被提供。

谁能告诉我发生了什么?


编辑: 我做了Peter Knego在下面亲切建议的,做了一个过滤器。现在我的web.xml有:

  <filter-mapping>
    <filter-name>RedirectToHRDFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

这仍然不适用于'真实'的引擎,就像之前尝试它在本地工作一样。 我的过滤器有以下方法:

  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain)
  throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest)req;
    HttpServletResponse response = (HttpServletResponse)resp;
    response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
    String redirectURL = "http://fit20app-hrd.appspot.com"+request.getRequestURI();
    if (request.getQueryString() != null) {
      redirectURL += "?"+request.getQueryString();
    }
    response.setHeader("Location", redirectURL);
  }

现在我认为这个过滤器可能会被破坏,即使它在本地工作。在Google的服务器上,它适用于/和/index.jsp,但不适用于其他任何内容。


这已经解决,请参阅下面的评论。

1 个答案:

答案 0 :(得分:2)

<url-pattern>内不能有多个<servlet-mapping>。而是创建多个<servlet-mapping>,每个<url-pattern>都有一个{{1}}元素。

此外,由于您尝试重定向所有内容,因此应使用servlet过滤器。