【问题标题】:Google Guice on Google Appengine: mapping with working _ahGoogle Appengine 上的 Google Guice:使用工作 _ah 进行映射
【发布时间】:2011-02-20 21:15:31
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: java google-app-engine guice


    【解决方案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 :

    <filter>
        <filter-name>guiceFilter</filter-name>
        <filter-class>com.kya.guice.mvc.GaeSafeGuiceFilter</filter-class>
    </filter>
    

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

    【讨论】:

    • 感谢您的解决方案,我正在尝试允许使用 jsp 文件和收集所有 servlet。当 url 包含“*.jsp”时,我只是添加了一个不使用 guicefilter 过滤的条件
    【解决方案2】:

    仅供参考,这里有一种使用serveRegex的方法

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

    【讨论】:

    • 这应该是公认的答案。简单、优雅、有效。
    【解决方案3】:

    我使用 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>
    

    【讨论】:

    • 好吧,我刚刚使用了 _ah 过滤器配置,我想这会破坏过滤器链并使 _ah 再次工作。谢谢。
    【解决方案4】:

    我知道这是一个相当古老的问题,但它比 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 );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多