2010-05-18 96 views
3

我有一個Google Appengine/Guice/Wicket應用程序。我的問題是,由於映射,我無法再訪問/ _ah/admin頁面。谷歌Guice谷歌Appengine:映射與工作_ah

我的服務程序模塊說:

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

到目前爲止,這或多或少預計訪問/ _ah /管理員提供了一個404

我的問題是,我沒有找到一個解決辦法。

我試過serveRegex()的不同組合,但即使

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

導致問題,因爲檢票的URL調度得到打破。應用程序不斷重複路徑(例如/列表成爲/列表/列表等)。

任何想法?

回答

2

我用Spring/GAE使用UrlRewriteFilter解決了同樣的問題。請看看源碼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> 

+1

嗯,我只是採取_ah過濾器配置,我想這打破了過濾器鏈,並使_ah工作再次。謝謝。 – Marcus 2010-05-19 14:42:06

0

我知道這是是與所接受雁一個很老的問題,但解決的辦法是更直截了當比URL重寫。在你的吉斯的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); 
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

+0

感謝您的解決方案,我試圖允許使用jsp文件並收集所有的servlet。當url包含「* .jsp」 – 2014-04-30 23:32:20

3

僅供參考,這裏是一個辦法使用serveRegex

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

時,我只是添加一個條件來不過濾guicefilter這應該是公認的答案。簡單,優雅,有效。 – Jeremiah 2013-08-09 19:38:38