我有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等)。
有什么想法吗?
答案 0 :(得分:5)
我找到了一个更优雅的解决方案:
不使用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:
<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.kya.guice.mvc.GaeSafeGuiceFilter</filter-class>
</filter>
而不是com.google.inject.servlet.GuiceFilter
答案 1 :(得分:3)
仅供参考,以下是使用serveRegex
的方法serveRegex("/(?!_ah).*").with( WicketServlet.class, getWicketServletParams() );
答案 2 :(得分:2)
我使用UrlRewriteFilter解决了Spring / GAE的相同问题。请查看来源here。我假设一个类似的解决方案可以用于你的情况。
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN" "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">
<urlrewrite>
<rule>
<from>^/appstats/(.*)$</from>
<to last="true">/appstats/$1</to>
</rule>
<rule>
<from>^/_ah/(.*)$</from>
<to last="true">/_ah/$1</to>
</rule>
<rule>
<from>^/(.*)$</from>
<to last="true">/app/$1</to>
</rule>
答案 3 :(得分:0)
我知道这是一个非常古老的问题,有一个被接受的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 );