Google Guice в Google Appengine: сопоставление с работающими _ah - PullRequest
3 голосов
/ 18 мая 2010

У меня есть приложение Google Appengine / Guice / Wicket. Моя проблема в том, что из-за сопоставления я больше не могу получить доступ к странице / _ah / admin.

Мой модуль сервлетов говорит:

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

пока более или менее ожидается, что доступ к / _ah / admin даст 404.

Проблема в том, что я не могу найти обходной путь.

Я пробовал разные комбинации serveRegex (), но даже

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

приводит к проблемам, так как диспетчеризация URL Wicket нарушается. Приложение продолжает повторять путь (например, / list становится / list / list и т.д.).

Есть идеи?

Ответы [ 4 ]

5 голосов
/ 14 марта 2012

Я нашел более элегантное решение:

Вместо использования GuiceFilter, создайте его подкласс для перехвата вызовов _ah / * и позвольте контейнеру сервлета выполнять свою обычную работу вместо того, чтобы 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

3 голосов
/ 01 мая 2012

Просто для справки, вот способ сделать это с serveRegex

serveRegex("/(?!_ah).*").with( WicketServlet.class, getWicketServletParams() );
2 голосов
/ 19 мая 2010

Я решил ту же проблему с Spring / GAE, используя UrlRewriteFilter . Пожалуйста, посмотрите на источник здесь . Я предполагаю, что подобное решение может быть использовано для вашей ситуации.

<!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>

0 голосов
/ 08 июля 2011

Я знаю, что это довольно старый вопрос с принятым ответом, однако решение более простое, чем перезапись URL.В вашем модуле сервлета Guice вы можете передать параметры конфигурации следующим образом:


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 );
...