Google Appeice上的Google Guice:使用_ah进行映射

我有一个Google Appengine / Guice / Wicket应用程序。 我的问题是,由于映射,我无法再访问/ _ah / admin页面了。

我的Servlet模块说:

serve( "/*" ).with( WicketServlet.class, getWicketServletParams() ); 

到目前为止,或多或少地预期访问/ _ah / admin会给出404。

我的问题是我没有找到解决方法。

我尝试了不同的serveRegex()组合,但是甚至

 serveRegex( "/.*" ).with( WicketServlet.class, getWicketServletParams() ); 

导致问题,因为Wicket的URL调度被破坏。 应用程序继续重复路径(例如/ list变为/ list / list等)。

有任何想法吗?

我使用UrlRewriteFilter解决了Spring / GAE的相同问题。 请在这里查看来源。 我假设一个类似的解决方案可以用于您的情况。

    ^/appstats/(.*)$ /appstats/$1   ^/_ah/(.*)$ /_ah/$1   ^/(.*)$ /app/$1  

我找到了一个更优雅的解决方案:

它不是使用GuiceFilter,而是将其子类化为拦截_ah / *调用,让servlet容器执行常规作业,而不是让Guice拦截它。 在这里,我阻止Guice拦截/ _ah / *但是/ _ah / warmup因为/ _ah / warmup应该由程序员处理。

 package com.kya.guice.mvc; import java.io.IOException; import java.util.regex.Pattern; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import com.google.inject.servlet.GuiceFilter; public class GaeSafeGuiceFilter extends GuiceFilter { private static final Pattern p = Pattern.compile("/_ah/.*"); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)request; if (p.matcher(req.getRequestURI()).matches() && !req.getRequestURI().equals("/_ah/warmup")) { chain.doFilter(request, response); return ; } super.doFilter(request, response, chain); } } 

然后,您只需使用以下命令更改web.xml:

  guiceFilter com.kya.guice.mvc.GaeSafeGuiceFilter  

而不是com.google.inject.servlet.GuiceFilter

仅供参考,以下是使用serveRegex执行此操作的方法

 serveRegex("/(?!_ah).*").with( WicketServlet.class, getWicketServletParams() ); 

我知道这是一个非常古老的问题,有一个被接受的anser,但是解决方案比URL重写更直接。 在Guice servlet模块中,您可以传递配置参数,如下所示:

 Map wicketParams = new HashMap(3); wicketParams.put(WicketFilter.IGNORE_PATHS_PARAM, "/_ah/*"); wicketParams.put(WicketFilter.FILTER_MAPPING_PARAM, ROOT_FILTER_MAPPING_URL); filter("/*").through(GuiceWicketFilter.class, wicketParams );