2016-09-29 129 views
0

我需要創建一個Filter來捕獲所有的HEAD請求並將返回狀態200。強制Spring在HEAD請求上返回狀態200

正如我所承認的,我需要創建一個Filter來捕獲每個HEAD請求,並完成每個請求,並返回200,這是一個問題。

我的意思是過濾器捕獲請求,並能夠做一些事情,但我不需要一個請求,但一個響應將是200.那麼我還能做什麼?

public class HttpHeadFilter implements Filter { 
public void init(FilterConfig filterConfig) throws ServletException { 
} 

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

    if (isHttpHead(httpServletRequest)) { 
     chain.doFilter(new ForceHeadToOkStatusWrapper (httpServletRequest), response); 
    } else { 
     chain.doFilter(request, response); 
    } 
} 

public void destroy() { 
} 

private boolean isHttpHead(HttpServletRequest request) { 
    return "HEAD".equals(request.getMethod()); 
} 

private class ForceHeadToOkStatusWrapper extends HttpServletRequestWrapper { 
    public ForceGetRequestWrapper(HttpServletRequest request) { 
     super(request); 
    } 
    //somethig here 
} 
} 
+3

爲什麼這麼複雜?爲什麼你甚至需要調用'doFilter'?使用'response.setStatus(200)'並且不要調用'doFilter'。 –

+0

是的,這是尋找。我們可以發送迴應而不處理請求。 :) – ottercoder

回答

0

最後我創建了一個攔截器:

public class HttpHeadInterceptor extends HandlerInterceptorAdapter { 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 

     if (isHttpHead(request)) { 
      response.setStatus(HttpStatus.SC_OK); 
      return false; 
     } 
     return true; 
    } 

    private boolean isHttpHead(HttpServletRequest request) { 
     return HttpMethod.HEAD.equals(request.getMethod()); 
    } 

} 

並把它添加到WebMvcConfigurerAdapter:

@Override 
public void addInterceptors(InterceptorRegistry registry) { 
    registry.addInterceptor(new HttpHeadInterceptor()); 
} 

和它的作品光滑)

相關問題