当前位置: 首页 > 知识库问答 >
问题:

Spring Boot在最新版本上没有默认的401 JSON响应,但适用于旧的[重复]

秋和雅
2023-03-14

Spring Boot版本2.6.3似乎不再发送带有401代码和其他一些响应的默认JSON响应。

@Override
public void commence(HttpServletRequest httpServletRequest,
                     HttpServletResponse httpServletResponse,
                     AuthenticationException e) throws IOException, ServletException {

    logger.error("Responding with unauthorized error. Message - {}", e.getMessage());
    httpServletstrong textResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, e.getMessage());

}

响应将包含401代码,但有一个空正文。以前对于2.5.5版,正文将包含此JSON响应。

{
"timestamp": "2022-01-28T14:14:02.736+00:00",
"status": 401,
"error": "Unauthorized",
"path": "/api/auth/signin"
}

我最终像下面那样临时手动复制了它,但是我想知道是否仍然可以自动生成默认响应。这也适用于其他响应,我无法手动为其定义响应消息。也许它在新版本中有所改变,或者是Spring的一个错误?

response.setContentType("application/json;charset=UTF-8");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("timestamp", LocalDateTime.now().toString());
jsonObject.addProperty("status",  response.getStatus());
jsonObject.addProperty("error", HttpStatus.UNAUTHORIZED.getReasonPhrase());
jsonObject.addProperty("message", "Error: Unauthorized");
jsonObject.addProperty("path", request.getServletPath());
response.getWriter().write(jsonObject.toString());

我确实找到了这个https://stackoverflow.com/a/62651683/7184439这解释了如何覆盖。

共有1个答案

酆晔
2023-03-14

跟随@Chin Huang的链接,基本上恢复了行为。

我将以下代码作为解决方法添加到Spring Security配置中,现在我再次收到默认错误消息。

@Bean
static BeanFactoryPostProcessor removeErrorSecurityFilter() {
    return (beanFactory) -> 
        ((DefaultListableBeanFactory)beanFactory).removeBeanDefinition("errorPageSecurityInterceptor");
}

恢复此行为的其他方法是允许显式访问“/error”。

https://github.com/spring-projects/spring-boot/issues/28759#issuecomment-975408187

https://github.com/spring-projects/spring-boot/issues/28953

在Spring Boot 2.6中,错误响应正文为空

 类似资料:
  • 问题内容: 有序词典是非常有用的结构,但是不幸的是,它们仅在3.1和2.7版本中才是最近的版本。在旧版本中如何使用有序词典? 问题答案: 我在pip python 2.6上安装了ordereddict

  • 我最近安装了蟒蛇版本的Python。现在,当我在终端中键入python时,它会打开Anaconda发行版,而不是默认发行版。如何让它在windows上使用命令python的默认版本?我已经将分发添加到路径中,但当我键入python--version时,它显示的是conda版本,而不是系统版本。

  • 好的,所以任何回答的人请注意,我是一个完整的初学者,所有这些。但是我已经安装了jdk1.8.0,因为这是Android Studio的最新版本所需要的,但是当我打开Android Studio时,它说我仍然需要改变它。所以经过大量的研究,我做了一个新的Java_Home变量,并将目录设置为我的jdk文件所在的位置。然后我进入android Studio文件,项目结构,然后改变了jdk目录。然而,当

  • 我在尝试访问简单的localhost https url时收到一个非常奇怪的异常。 我的env:jdk1.8.0\u 121在Windows上,我正在从Netbeans运行java main,它打开到https url的连接,该url托管在独立的jetty 9.4.5中,配置有自签名证书。 例外情况: Java语言io。IOException:sun上的Http响应无效。反映NativeConst

  • 问题内容: 我注意到我的应用程序无法在Pixel 3上运行。我进入android studio并模拟了一些设备,发现它在任何Android Pie(API 28)设备上均不工作,但在其他任何设备上均能正常工作。我在代码中放了一些日志,看来我在Volley使用中没有得到响应。该应用程序本身已加载,但未显示任何数据,并且收到错误消息 E / RecyclerView:未连接适配器;跳过布局 我的代码是

  • 我有两个版本的oracle,oracle Database 11g Enterprise Edition 11.2.0.1.0版本-生产版和oracle Database 11.g Enterprise Edition版本11.2-0.3.0版本-64位生产版 我有这个sql: 它适用于11.2.0.1.0,但在11.2.0.3.0上,我收到此错误: 我能做些什么来解决这个问题? 感谢。