通过google-app-engine中的web.xml重定向 [英] redirect through web.xml in google-app-engine

查看:96
本文介绍了通过google-app-engine中的web.xml重定向的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

迁移到新的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>

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

pre $ public void doFilter(ServletRequest req,ServletResponse resp,FilterChain filterChain)
抛出IOException,ServletException {
HttpServletRequest请求=(HttpServletRequest)req;
HttpServletResponse响应=(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,但不适用于其他任何内容。






解决方法 c>在< servlet-mapping> 内部。而是创建多个< servlet-mapping> ,每个< url-pattern> 元素。



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


After migrating to the new HRD store, I want to redirect requests to my old application to the new HRD application. I know I should let the Google migration tool make an alias, but since I migrate an intermediate copy of my app (because of the nightmares that migrating the database causes) that is not an option.

My plan was to use a servlet that does a HTTP 301 (HttpServletResponse.SC_MOVED_PERMANENTLY) redirect, and use a servlet-mapping with /* in web.xml. This works locally, but on the real app-engine, it doesn't. It seems like there is no URL pattern that the app-engine correctly recognizes. So far I have:

  <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>

I know it looks crazy, but I was desperate. Only '/' and 'index.jsp' get redirected, through the RedirectToHRD servlet. For other pages (JSP or anything else) this does not work. The log file just happily indicates that the pages get served.

Can anyone tell me what is happening?


Edit: I did what Peter Knego kindly suggested below, and made a filter. Now my web.xml has:

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

This still does not work on the 'real' appengine, and like the earlier attempt it does work locally. My filter has the following method:

  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);
  }

Now I am thinking that this filter may be broken, even though it works locally. On Google's servers it works for / and /index.jsp, but not for anything else.


This is solved, see comment below.

解决方案

You can not have multiple <url-pattern> inside a <servlet-mapping>. Instead create multiple <servlet-mapping> with each having one <url-pattern> element.

Also, since you are trying to redirect everything you should use a servlet filter instead.

这篇关于通过google-app-engine中的web.xml重定向的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆