2016-09-29 128 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()); 
} 

和它的作品光滑)

相关问题