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?