gpt4 book ai didi

java - Spring AuthenticationEntryPoint 返回 Tomcat HTML 错误而不是 JSON

转载 作者:行者123 更新时间:2023-12-04 17:49:19 26 4
gpt4 key购买 nike

我正在使用 Spring 在更大的应用程序中公开 API。当访问 authenticated() 配置后面的端点时,我的应用程序由于以下代码而抛出一个丑陋的 Tomcat HTML 错误:

@Component
public class EntryPointUnauthorizedHandler implements AuthenticationEntryPoint {

@Override
public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
AuthenticationException e) throws IOException, ServletException {
httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Access Denied");
}
}

但是,由于这是一个 API,我只想返回 JSON,就像在我的其他 API 中一样。对于正常的异常处理,我设置了以下 @ControllerAdvice:

@ControllerAdvice
public class DefaultExceptionHandler extends ResponseEntityExceptionHandler {

/**
* Default internal BadCredentialsException handler. Respond with 401 Unauthorized
*/
@ExceptionHandler(value = BadCredentialsException.class)
public ResponseEntity<Object> handleBadCredentialsException(BadCredentialsException e, WebRequest request) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return handleExceptionInternal(e, null, headers, HttpStatus.UNAUTHORIZED, request);
}

/**
* Fallback default exception handler. Respond with 500
*/
@ExceptionHandler(value = Exception.class)
public ResponseEntity<Object> handleFallbackException(Exception e, WebRequest request) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return handleExceptionInternal(e, null, headers, HttpStatus.INTERNAL_SERVER_ERROR, request);
}

@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body,
HttpHeaders headers, HttpStatus status, WebRequest request) {

final ErrorResponse error = new ErrorResponse(status, ex.getMessage());

if (HttpStatus.INTERNAL_SERVER_ERROR.equals(status)) {
request.setAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE, ex, WebRequest.SCOPE_REQUEST);
}

return new ResponseEntity<Object>(error, headers, status);
}
}

其中 ErrorResponse 是我自己的小响应包装器,包含 HttpStatus 代码和异常消息。这可以很好地格式化为 JSON:

{
"status": 401,
"message": "Bad credentials"
}

我如何确保只有请求和响应对象的 AuthenticationEntryPoint 返回类似格式的错误,而不是丑陋的 Tomcat HTML 页面。

最佳答案

您可以根据需要更改HttpServletResponse。看看:https://stackoverflow.com/a/19788700/1490806

关于java - Spring AuthenticationEntryPoint 返回 Tomcat HTML 错误而不是 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46348923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com