2010-05-05 3 views
3

Во-первых, я использую Google AppEngine и Guice, но я подозреваю, что моя проблема не связана с ними.Как применить фильтр сервлета при непосредственном обслуживании HTML-страницы?

Когда пользователь подключается к моему (GWT) webapp, URL-адрес является прямой страницей html. Например, в режиме разработки это: http://127.0.0.1:8888/Puzzlebazar.html?gwt.codesvr=127.0.0.1:9997. Теперь я могу настроить мой web.xml следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
version="2.5"> 
<display-name>PuzzleBazar</display-name> 

<!-- Default page to serve --> 
<welcome-file-list> 
    <welcome-file>Puzzlebazar.html</welcome-file> 
</welcome-file-list> 


<filter> 
    <filter-name>guiceFilter</filter-name> 
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>guiceFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<!-- 
    This Guice listener hijacks all further filters and servlets. Extra 
    filters and servlets have to be configured in your 
    ServletModule#configureServlets() by calling 
    serve(String).with(Class<? extends HttpServlet>) and 
    filter(String).through(Class<? extends Filter) 
--> 
<listener> 
    <listener-class>com.puzzlebazar.server.guice.MyGuiceServletContextListener 
    </listener-class> 
</listener> 

</web-app> 

И мой appengine-web.xml является:

<?xml version="1.0" encoding="utf-8"?> 
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> 
    <application>puzzlebazaar</application> 
    <version>1</version> 
    <sessions-enabled>true</sessions-enabled> 

    <!-- Configure java.util.logging --> 
    <system-properties> 
     <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>  
    </system-properties> 

</appengine-web-app> 

Поскольку я использую Guice, я должен настроить дополнительные фильтры в моем ServletModule, где я это:

filter("*.html").through(SecurityCookieFilter.class); 

Но мой SecurityCookieFilter.doFilter никогда не вызывается. Я пробовал такие вещи, как "*.html*" или <url-pattern>*</url-pattern>, но безрезультатно. Любая идея, как я должен это делать?

+0

я обнаружил, что он работает за счет перехода на «.jsp» вместо «.html». –

ответ

3

Возможно, вы настроили html-файлы, которые будут отображаться как статический контент в вашем appengine-web.xml. Статическая файловая служба вообще не включает ваше приложение, поэтому вы не можете фильтровать вывод.

+0

Спасибо. Я добавил appengine-web.xml. Что-нибудь не хватает? –

+0

Похоже, ваш html обслуживается как статический файл, и, как я уже сказал, это означает, что он вообще не касается вашего кода. Вам нужно создать сервлет, который обслуживает ваши файлы, если вы хотите, чтобы они были обработаны после обработки. –

1

Если ваша потребность случается (как у меня), чтобы сделать GAE добавить определенные заголовки ответа HTTP для статических HTML-файлов, вы можете сделать это, объявив их как статический ресурс в Appengine-web.xml, как это:

<static-files> 
    <include path="/my_static-files" > 
    <http-header name="Access-Control-Allow-Origin" value="http://example.org" /> 
    </include> 
</static-files> 

Я нашел это в GAE documentation

+0

приветствует это, поскольку это может сэкономить много неприятностей людям. К сожалению, для меня это немного застенчиво, так как я хочу перенаправление доменов 301 (от www. До голых), поэтому, если они поддерживают атрибут домена, как они делают путь один, это было бы идеально (было бы подавать заголовок местоположения). но AFAIK (и после прочтения остальных документов) это невозможно –