2017-03-23 22 views
0

我做了一個過濾器,它負責將.do的請求,並且是首次宣佈過濾器存在過濾URL效果:過濾和RequestDispatcher的改變上

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 

    if(! (request instanceof HttpServletRequest)){ 
     chain.doFilter(request, response); 
    } 

    HttpServletRequest httpServletRequest = (HttpServletRequest) request; 
    String requestUrl = httpServletRequest.getServletPath(); 

    if(!isBetaPathRequest(httpServletRequest) || StringUtils.contains(requestUrl,".")){ 
     chain.doFilter(request, response); 
     return; 
    } 

    String newUrl = requestUrl; 

    int lastIndexOf = requestUrl.lastIndexOf("?"); 
    if(lastIndexOf == -1){ 

     if(requestUrl.charAt(requestUrl.length()-1) != '/'){ 
     newUrl = newUrl.concat(".do"); 
     } 

    } 
    else{ 
     newUrl = requestUrl.substring(0, lastIndexOf-1) .concat(".do") .concat(requestUrl.substring(lastIndexOf)); 
    } 

    final RequestDispatcher rq = getRequestDispatcher(request, newUrl); 
    rq.forward(request, response); 
    } 

還有其他各種過濾器項目也宣告web.xml文件,我與調試器通知他們沒有運行。

當前映射一個重要濾波器是例如:

ContentResponseCachingFilter *。做

但初始傳入的請求不包括在URL .do,直到它通過BetaRewriteUrlFilter通過。

當調用RequestDispatcher.forward時,是否應用了過濾器,還是需要手動調用它們,或者使用302重定向?

回答

0

我最終做的是將這個新過濾器放在web.xml定義中。

該重寫過濾器需要在鏈上最後,因爲使用方法不會破壞功能或禁止其他過濾器的運行。