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

时间:2010-05-18 12:40:36

标签: java google-app-engine guice

我有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等)。

有什么想法吗?

4 个答案:

答案 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 );
相关问题