App Engine 上未调用 Servlet 过滤器

Posted

技术标签:

【中文标题】App Engine 上未调用 Servlet 过滤器【英文标题】:ServletFilter Not Called on AppEngine 【发布时间】:2014-02-16 19:49:41 【问题描述】:

我正在使用 Guice 设置过滤器来处理 AppEngine 上的所有请求。 Guice 设置如下:

public void configureServlets() 
    filter("*").through(RedirectFilter.class);

过滤器:

@Singleton
public class RedirectFilter implements Filter 
    private static final Logger logger = Logger.getLogger(RedirectFilter.class.getName());

    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException 
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        URL url = new URL(request.getRequestURL().toString());
        String domain = url.getHost();

        logger.info("host: " + domain + " path: " + url.getPath());

        if (!domain.startsWith("www")) 
            if (domain.startsWith("en")) 
                response.sendRedirect("http://www.mysite.com/en" + url.getPath());
            
        
        chain.doFilter(req, res);
    
    ...

但是,没有针对任何请求调用过滤器。

关于为什么它可能不被调用的任何想法?

更新:过滤器似乎是用http://en.mysite.com/xxx等URL调用的,但不是http://en.mysite.com

【问题讨论】:

【参考方案1】:

来自AppEngine documentation on static files:

在很多情况下,您希望将静态文件直接提供给 网络浏览器。图片、CSS 样式表、javascript 代码、电影和 Flash 动画通常都直接提供给浏览器。为了 效率,App Engine 从不同的服务器提供静态文件,而不是 那些调用 servlet。

默认情况下,App Engine 将 WAR 中的所有文件作为静态文件提供 除了 JSP 和 WEB-INF/ 中的文件之外的文件。对一个 URL 的任何请求 路径匹配一个静态文件,将文件直接提供给 浏览器——即使路径也匹配 servlet 或过滤器映射。你 可以配置 App Engine 将哪些文件视为静态文件,使用 appengine-web.xml 文件。

有关此主题的更多信息at this link。

要在请求静态 html 文件时调用您的过滤器,请将以下内容放入您的 appengine-web.xml 文件中:

<static-files>
  <include path="/**.png" />
  <!-- other includes go here -->
  <exclude path="/**.html" />
</static-files>

有关 AppEngine 静态文件配置的更多信息,请访问 this link。

【讨论】:

以上是关于App Engine 上未调用 Servlet 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

App Engine Java Servlet 未连接到 Cloud SQL

gwt- 如何读取文本文件(Google App Engine servlet)?

如何在 Google App Engine 的 app.yaml 文件中配置 servlet 过滤器?

将 App Engine servlet-api-2.5 升级到 servlet-api-3.1?

Google App Engine Java HTTP Post 图像从 API 方法到 Servlet

有哪些库可以在 Google App Engine/Java Servlet 上处理 XML