从 Spring Security 过滤器返回自定义 http 错误消息

2024-02-19

我正在构建一个 REST API,它使用 Spring Security(及其过滤器链)通过 JWT 对用户进行身份验证。现在,如果这样的 JWT 丢失、过期或类似情况,我想向 API 使用者返回格式良好的错误消息,而不是默认的白标错误响应。从 Spring Security 过滤器返回的 API 错误消息应该与业务逻辑失败时返回的错误消息相同。

如果业务逻辑失败,我的 Spring REST 控制器会返回格式如下的错误消息(通过@RestControllerAdvice):

Content-Type: application/json

{
  "code": "VOUCHER_NOT_FOUND",
  "message": "The specified voucher code was not found.",
  "timestamp": "2020-09-06T21:22:23.015Z"
}

据我所知,如果 Spring Security 过滤器链中发生错误,则永远无法到达控制器,因此我必须从安全过滤器中返回 HTTP 错误消息。我尝试这样做:

public class JwtAuthorizationFilter extends BasicAuthenticationFilter {

    @Override
    protected final void doFilterInternal(final HttpServletRequest request,
            final HttpServletResponse response, final FilterChain chain)
            throws IOException, ServletException {
        try {
            // Perform various auth checks here
            // Throw JwtAuthorizationException if a check fails
            chain.doFilter(request, response);
        } catch (JwtAuthorizationFailedException e) {
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            response.setHeader("Content-Type", "application/json");  // does not work
            response.getWriter().write("{ \"Simple\": \"Test\" }");
        }

}

问题是,我收到的错误消息总是设置不同的Content-Type标题(带有charset=ISO-8859-1 added):

Content-Type: application/json;charset=ISO-8859-1

{
  "Simple": "Test"
}

我想简化这一点并使其保持一致。所以问题是,我怎样才能确保,只有

Content-Type: application/json

是从安全过滤器返回的吗?我尝试过很多选择,比如

response.setHeader("Content-Type", "application/json");

or

response.setContentType(MediaType.APPLICATION_JSON_VALUE);

但所有这些都不起作用。有任何想法吗?


本例的问题来自于getWriter() method:

这包括默认的字符编码到Response它将被返回,正如您在下图中看到的那样,它会激发内部的“附加信息”Content-Type.

当 Spring 序列化响应时,使用“getter 方法”,并且如您所见,getContentType包括当前的charset。这就是你看到除了想要的之外的一个的原因Content-Type value.

即使你尝试设置charset with a null值,它不会工作,因为该方法会检测到您正在使用Writer并且它不会被改变(看下一张图片)

但是,有一种方法可以实现您想要的:

} catch (JwtAuthorizationFailedException e) {
  response.setStatus(HttpStatus.UNAUTHORIZED.value());
  response.getOutputStream().print("{ \"Simple\": \"Test\" }");
  response.setContentType(MediaType.APPLICATION_JSON_VALUE);
}

Use getOutputStream().print代替getWriter().write

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Spring Security 过滤器返回自定义 http 错误消息 的相关文章

随机推荐

  • Reddit 主页上的分页是如何工作的?

    Reddit 使用时间衰减算法 这意味着排序顺序可能会发生变化 当用户转到第 2 页时 是否有一种机制可以防止他们看到第 1 页上的帖子 但在翻页之前已跳至第 2 页 这只是排序方法的一个可接受的缺陷吗 或者是否为用户缓存了前几个页面 这样
  • 在android中获取网关ip地址

    如何获取网关 IP 详细信息 可以选择使用 wifimanager 但是 如果没有 wify 当使用 USB 网络共享连接时 如何在 Android 设备中查找网关 DNS 和其他详细信息 我在android 2 3 4上使用cyanoge
  • 在我的项目中实施 ACTION_OPEN_DOCUMENT 时遇到问题

    我有 AddActivity 它可以让您从相机拍摄的图片或从图库中选择的图像中获取 URI 然后就可以去DetailsActivity查看图片了 我现在可以正常工作 直到您重新启动设备为止 重新启动并尝试转到该图像的 DetailsActi
  • R:如何在省略号中使用列表元素(如参数)?

    我不确定我的问题标记是否正确 但我试一试 我想使用一个带有使用省略号的函数的包 func 我所有的课堂论点My Class都在一个列表中 因为我有很多争论 所以我想避免func arg1 arg2 arg3 所以理想情况下我想做func m
  • 如何在Matlab中区分图例和轴?

    下面的堆栈溢出问题 Matlab 如何获取图形句柄中的所有轴句柄 https stackoverflow com questions 3938348 matlab how to obtain all the axes handles in
  • gnuplot:误解数据(直方图)

    我有以下示例数据文件 我想在其中绘制gnuplot作为直方图 1 1 2 2 4 3 我正在使用以下命令来绘制数据 plot sample data with boxes 生成以下图表 然而 图表应该看起来像这样 不应该有任何价值3 Fro
  • 为什么在 CSS 中 * 比属性继承具有更多的特殊性?

    简而言之 我有一个具有这两种样式的页面 color black div error color red 页面结构如下 div class error div class row form div class column Error tex
  • 致命异常:Firebase-Messaging-Intent-Handle -- java.lang.NoClassDefFoundError

    我的项目中没有使用任何 Firebase 或 Youtube 代码 库 然而最近 在 Android 预发布报告中 我看到了以下崩溃 FATAL EXCEPTION Firebase Messaging Intent Handle Proc
  • 使用 CDN 链接和 SCSS 覆盖 bootstrap 4

    我在这里看到的关于使用 SCSS 覆盖 Bootstrap v4 的所有答案都假设 Bootstrap 或 Bootstrap 的 CSS 文件 已下载到站点目录 我通过 CDN 链接将 bootstrap 导入到我的 layout htm
  • 使用包含数字的字符串对数组进行排序[重复]

    这个问题在这里已经有答案了 可能的重复 使用 NSSortDescriptor 对 NSString 值进行排序 就像 NSInteger 一样 https stackoverflow com questions 9674707 sorti
  • 我可以将 2 个cameraUpdates 与一个 animateCamera 一起使用吗?

    我正在尝试放大地图 CameraUpdate cameraUpdate CameraUpdateFactory newLatLngBounds mBounds this getResources getDisplayMetrics widt
  • phpDocumentor - 无法打开输入文件:phpdoc.php

    我正在尝试使用 phpDocumentor 第一次 我不知道我在做什么 实际上 我只想将它与 SublimeText 2 一起使用this https github com benmatselby sublime phpdocumentor
  • 更改枢轴控件中标题和标题的背景

    在我的 Phone 7 应用程序中 我使用了枢轴控件 现在我想更改其标题和标题区域的背景 我怎样才能实现这个目标 是否有可定制的枢轴控件的整体模板 我已经尝试将包含枢轴控件的网格的背景设置为标题颜色 然后将每个枢轴项的背景设置为原始背景颜色
  • 如何在 Google Cloud Platform 中为 Node 应用程序安装 Python3

    我正在为我的 Nodejs 应用程序使用谷歌云平台 问题 部署应用程序后 我可以访问 python2 7 但不能访问版本 3 usr bin 文件夹中似乎缺少此版本 const spawn require child process spa
  • 如何在 MongoDB 中搜索子数组

    我有这个 MongoDB 集合 id ObjectId 123 from name name from email email protected cdn cgi l email protection to name domains ema
  • 将 LIKE 子句的 SQL 语法缩短为 IN 子句

    在 SQL 中 有没有办法缩短语法 Select from TableName where ColumnName like A or ColumnName like B or ColumnName like C To Select from
  • 如何处理服务延迟的数据?

    在我的角度应用程序中 我需要将数据存储到一个数组中 该数组在初始阶段为空 Example someFunction let array console log step 1 this service getRest url subscrib
  • AVAssetReader 读取音频,然后失败

    我的应用程序读取音频并在生产者 消费者设置中播放它 消费者线程请求新样本渲染到硬件 生产者线程使用 AVAssetReader 将音频数据从磁盘读取到其缓冲区中 生产者线程循环运行 检查是否需要读取更多样本 制作者的缓冲区大小等于 4 秒的
  • 帮助使用比较器比较浮点成员变量

    我可以很好地比较字符串 但想知道如何对浮点数进行排名 getChange 返回一个字符串 我希望能够按降序排序 我怎样才能做到这一点 UPDATE package org stocktwits helper import java util
  • 从 Spring Security 过滤器返回自定义 http 错误消息

    我正在构建一个 REST API 它使用 Spring Security 及其过滤器链 通过 JWT 对用户进行身份验证 现在 如果这样的 JWT 丢失 过期或类似情况 我想向 API 使用者返回格式良好的错误消息 而不是默认的白标错误响应