onceperrequestfilter中的返回主体

4sup72z8  于 2021-07-13  发布在  Java
关注(0)|答案(0)|浏览(280)

更新:在和一位同事研究过这个问题之后,这可能是因为spring应用程序在tomcat服务器上运行,而tomcat服务器遵循标准协议(https://www.w3.org/protocols/rfc2616/rfc2616-sec9.html),并且不会为head请求返回正文。

我设计了onceperrequestfilter来拒绝任何head请求,您可以在这里看到:

@Component
public class RestrictedResponseFilter extends OncePerRequestFilter {

    @Autowired
    @Qualifier("handlerExceptionResolver")
    private HandlerExceptionResolver resolver;

    @Override
    public void doFilterInternal(HttpServletRequest httpRequest, HttpServletResponse httpServletResponse, FilterChain chain) throws IOException, ServletException {
        if(httpRequest.getMethod().equals(HttpMethod.HEAD.name())){
            resolver.resolveException(httpRequest,httpServletResponse,null,new RequestRejectedException("Http Method HEAD rejected"));
        } else {
            chain.doFilter(httpRequest,httpServletResponse);
        }
    }
}

resolver.resolveexception通过我的responseentityexceptionhandler类发送请求:

@CrossOrigin("*")
@Slf4j
@RestControllerAdvice
public class MyExceptionHandler extends ResponseEntityExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(MyExceptionHandler.class);

...

    @ExceptionHandler(RequestRejectedException.class)
    public ResponseEntity handleRequestRejectedException(final RequestRejectedException e, final WebRequest request){
        logger.error(e.getMessage(), e);
        return handleExceptionInternal(e,null,null,HttpStatus.FORBIDDEN,request);
    }

    private SpringErrorSwaggerDefinition buildResponse(final Exception e, final WebRequest request, final HttpStatus status){
        final SpringErrorSwaggerDefinition cvdosResponse = SpringErrorSwaggerDefinition.builder()
                .message(e.getMessage())
                .timestamp(System.currentTimeMillis())
                .error(status.getReasonPhrase())
                .exception(e.getClass().getName())
                .path(request.getContextPath())
                .status(status.value())
                .build();
        return cvdosResponse;
    }

    @Override
    protected ResponseEntity<Object> handleExceptionInternal(
            Exception ex, @Nullable Object body, @Nullable HttpHeaders headers, HttpStatus status, WebRequest request) {
        final SpringErrorSwaggerDefinition response = buildResponse(ex,request,status);
        return new ResponseEntity<>(response, status);
    }

}

此类中处理的其他异常返回springerrorswaggerdefinition响应主体。但是,通过过滤器时不会发生这种情况。我如何解决这个问题?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题