1

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

我的计划是使用一个执行 HTTP 301 (HttpServletResponse.SC_MOVED_PERMANENTLY) 重定向的 servlet,并在 web.xml 中使用带有 /* 的 servlet 映射。这在本地工作,但在真正的应用程序引擎上,它没有。似乎没有应用引擎正确识别的 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,但不适用于其他任何东西。


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

4

1 回答 1

2

你不能<url-pattern>在一个<servlet-mapping>. 而是创建多个<servlet-mapping>,每个都有一个<url-pattern>元素。

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

于 2012-11-26T11:21:06.843 回答