2016-01-13 55 views
0

有點難以讓我的網址寫入正確。我剛剛發現了大約UrlRewriteFilter,它似乎正是我所需要的,因爲使用Java與GAE重寫URL是很困難的(它使用python/go和app.yaml非常簡單,但對於Java而言,這是一個主要的難題屁股出於某種原因,我必須使用Java)。下面是我有 -使用UrlRewriteFilter從頁面中刪除.html擴展名? - 使用GAE

<rule> 
    <from>^/test.html$</from> 
    <to>/test</to> 
</rule> 

我只是希望人們能夠輸入mysite.com/test而不是mysite.com/test.html。我是否以正確的方式去做這件事?當我使用上面的代碼時,我得到由java.lang.StackOverflowError引起的HTTP ERROR 500

任何幫助,將不勝感激!謝謝。

回答

0

我試圖在我的研究中使用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上生效,所以通過這個過濾器服務時,我可以忍受輕微的性能下降。如果有人找到了更好的方法來做到這一點,請留下評論。