我試圖在我的研究中使用Paul Tuckey的UrlRewriteFilter來處理您的other question。這對我來說並不好,原因有兩個。
- 我不喜歡過濾與UrlRewriteFilter所有請求的想法,因爲所有的請求必須通過App Engine的情況下被路由,併爲此切割出的內容分發網絡
- 我可能是錯的這個但如果我沒有記錯的話,在對UrlRewriteFilter的快速冒險中,我發現過濾器在內部轉發到靜態內容,這不起作用,因爲appengine實例本身沒有設置爲提供靜態內容 - 只有內容交付網絡那。
我做了最近看起來是這樣的:
public class RewriteFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
log.info("Proxy Servlet for: " + httpServletRequest.getRequestURI());
byte[] buffer = new byte[1024];
try (InputStream is = new FileInputStream("index.html"); OutputStream os = httpServletResponse.getOutputStream()) {
int read = is.read(buffer);
while (read > 0) {
os.write(buffer, 0, read);
read = is.read(buffer);
}
}
// chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
雖然是真難看,這個工作,哪怕只是index.html頁面(以及我可以改變這種帶有過濾器初始化參數和定義多個過濾器)。
但是,爲什麼它的工作UrlRewriteFilter不?
答案很簡單。這個過濾器servlet不會將內部轉發給靜態內容,而是爲內容本身提供服務。由於這個過濾器只會在我通過web.xml中的<filter-mapping>
下面的<url-pattern>
指定的url上生效,所以通過這個過濾器服務時,我可以忍受輕微的性能下降。如果有人找到了更好的方法來做到這一點,請留下評論。