2012-09-29 31 views
5

如何使用過濾器或servlet更改requestURL。如何使用過濾器或servlet更改requestURL

例如,如果要求爲 「http:// servername1:8080」 我想的一樣更改爲 「HTTP:// servername2:7001」

+0

此方法不起作用。幸運的是,這一個工程很好http://stackoverflow.com/questions/2725102/how-to-use-a-servlet-filter-in-java-to-change-an-incoming-servlet-request-url –

回答

13

添加以下servlet filter到應用程序:

public class RequestUrlRewritingFilter implements Filter { 

    //Empty init()/destroy() here 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     final HttpServletRequestWrapper wrapped = new HttpServletRequestWrapper(request) { 
      @Override 
      public StringBuffer getRequestURL() { 
       final StringBuffer originalUrl = ((HttpServletRequest) getRequest()).getRequestURL(); 
       return new StringBuffer("http://servername2:7001"); 
      } 
     }; 
     chain.doFilter(wrapped, response); 
    } 
} 

你想攔截的所有請求都必須經過它。正如你所看到的,它需要原始request方法並通過返回不同的值來重寫getRequestURL()方法。如果您想在舊版本上添加新網址,您仍然可以訪問原始請求。

最後,您必須繼續處理請求chain.doFilter(),但通過提供包裝的請求,而不是原來的請求。

+0

在我的結尾我遇到此錯誤: 構造函數HttpServletRequestWrapper(ServletRequest)未定義 –

+0

Rabia,您可能需要將HttpServletRequest傳遞給包裝器構造函數 – inor

0

與網絡上的許多其他人使用.forward()打破過濾鏈相比,上述方法是一個很好的解決方案。該解決方案允許後續過濾器在修改後處理請求。

但是爲了使其對下游過濾器處理「透明」,還必須實施2個附加方法,並且它們必須呈現相同的URL修改以呈現一致的請求對象。包裝必須執行:

@Override 
public String getRequestURI() { 
    final String originalUri = ((HttpServletRequest)getRequest()).getRequestURI(); 
    return "/"; // Must be consistent with getRequestURL() 
} 
@Override 
public String getServletPath() { 
    final String originalPath = ((HttpServletRequest)getRequest()).getServletPath(); 
    return "/"; // Must be consistent with getRequestURL() 
} 
相關問題