更新:在和一位同事研究过这个问题之后,这可能是因为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响应主体。但是,通过过滤器时不会发生这种情况。我如何解决这个问题?
暂无答案!
目前还没有任何答案,快来回答吧!