迁移到新的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,但不适用于其他任何内容。
这已经解决,请参阅下面的评论。
答案 0 :(得分:2)
<url-pattern>
内不能有多个<servlet-mapping>
。而是创建多个<servlet-mapping>
,每个<url-pattern>
都有一个{{1}}元素。
此外,由于您尝试重定向所有内容,因此应使用servlet过滤器。