使用 Spring 的 @RequestBody 并随后读取 HttpServletRequest.getInputStream()

2024-01-09

我正在使用 Spring 将请求的 JSON POST 数据映射到一个对象中@RequestBody注释和MappingJacksonHttpMessageConverter。但之后我想读取数据String表单进行一些额外的身份验证。但是当编组发生时,InputStream in HttpServletRequest是空的。一旦我删除@RequestBody将 POST 数据读入方法的参数String按预期工作。

我是否必须通过放弃来妥协@RequestBody并以某种方式手动进行绑定还是有更优雅的解决方案?


因此,基本上您需要计算请求正文的哈希值。优雅的方法是将装饰器应用到InputStream.

例如,在处理程序方法内部(在这种情况下,您不能使用@RequestBody并需要创建HttpMessageConverter手动):

@RequestMapping(...)
public void handle(HttpServletRequest request) throws IOException {
    final HashingInputStreamDecorator d = 
        new HashingInputStreamDecorator(request.getInputStream(), secretKey);
    HttpServletRequest wrapper = new HttpServletRequestWrapper(request) {
        @Override
        public ServletInputStream getInputStream() throws IOException {
            return d;
        }
    };

    HttpMessageConverter conv = ...;
    Foo requestBody = (Foo) conv.read(Foo.class, new ServletServerHttpRequest(wrapper));
    String hash = d.getHash();

    ...
}

其中 hash 是在 overriden 中增量计算的read的方法HashingInputStreamDecorator.

您还可以使用@RequestBody如果你创建一个Filter应用装饰器。在这种情况下,装饰器可以将计算出的哈希值作为请求属性传递给处理程序方法。但是,您需要仔细映射此过滤器,以仅将其应用于对特定处理程序方法的请求。

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

使用 Spring 的 @RequestBody 并随后读取 HttpServletRequest.getInputStream() 的相关文章

  • 我们可以有条件地声明 spring bean 吗?

    有没有一种方法可以有条件地声明 Spring bean 例如
  • Chrome 开发工具无法显示响应,即使返回的内容具有标题 Content-Type:text/html;字符集=UTF-8

    为什么我的 Chrome 开发者工具显示 无法显示响应数据 当返回的内容是text html类型时响应 在开发者工具中查看返回的响应的替代方法是什么 我认为只有当您选中 保留日志 并且您在导航离开后尝试查看先前请求的响应数据时 才会发生这种
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 无法验证 Spring Security 中 url 模式的角色

    我正在使用 spring security 3 1 7 RELEASE 和 spring 3 2 13 RELEASE 我的 spring security xml 中有如下条目
  • 使用@Transactional注解批量插入

    在我的 Spring 应用程序中 我想一次性在数据库中插入近 1500 条记录 我在后端使用 Spring 4 X 和普通休眠 在我的服务层中 我使用 Transactional 注释 现在 在某个时间点之后插入记录时 我遇到内存不足错误
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • Jackson:将对象引用为属性

    在我的 java spring 应用程序中 我正在使用 hibernate 和 jpa 并使用 jackson 来填充数据库中的数据 这是用户类 Data Entity public class User Id GeneratedValue
  • Spring Web应用程序在启动时从数据库初始化

    Spring 3 1 汤姆猫 我这里有一个设计问题 数据库中已指定一组类别 这些类别可以被认为是全局的 因为它们可以在整个网络应用程序中使用 我想做的是在服务器启动时读取这些类别并用 Java 填充某种类型的集合 只需要在启动时从数据库读取
  • 带点 (.) 的 Spring MVC @PathVariable 被截断

    这是问题的延续Spring MVC PathVariable 被截断 https stackoverflow com questions 3526523 spring mvc pathvariable getting truncated S
  • 面向服务的架构 - AMQP 或 HTTP

    一点背景 非常大的整体 Django 应用程序 所有组件都使用相同的数据库 我们需要分离服务 以便我们可以独立升级系统的某些部分而不影响其余部分 我们使用 RabbitMQ 作为 Celery 的代理 现在我们有两个选择 使用 REST 接
  • 无法使用注释从 .properties 文件中提取值

    我想通过 properties 文件配置我的 bean 字符串字段 但它不会替换 value 键 意味着它会回显 value 字符串 我的代码如下 主要类别 public class Main public static void main
  • 诸如用于测试 HTTP 请求的虚拟 REST 服务器之类的东西? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我一直在四处寻找 但找不到任何这样的网站 我想知道是否有一些虚拟服务器可以响应测试 GET 请求并返回
  • 按值对 JSON 进行排序

    我有一个非常简单的 JSON 对象 如下所示 people f name john l name doe sequence 0 title president url google com color 333333 f name micha
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • 优化数据可视化 Web 应用程序的性能

    我正在重写 3 年前编写的数据可视化网络工具 从那时起 浏览器的 JavaScript 引擎变得更快 所以我正在考虑将部分工作从服务器转移到客户端 在页面上 数据在表格和地图 或图表 中可视化 它使用相同的数据 但以不同的方式 因此准备显示
  • $http.get() 与 JSON 数据

    我正在编写一个服务器应用程序 并希望客户端使用正文中的数据来参数化我的 GET 方法 如下所示 http v GET http localhost 3000 url text 123 foo bar GET url HTTP 1 1 Acc
  • 我如何在 C# .NET(win7 手机)中使用“DataContractJsonSerializer”读入“嵌套”Json 文件?

    我有一个问题 如果我的 json 文件看起来像这样 Numbers 45387 Words 空间桶 我可以很好地阅读它 但是如果它看起来像这样 Main Numbers 45387 Words 空间桶 某事 数字 12345 单词 克兰斯基
  • 如何在flutter项目中使用http拦截器?

    我必须向我的所有 Api 添加标头 有人告诉我为此使用 http 拦截器 但我无法理解如何做到这一点 因为我是颤振的新手 谁能帮我举个例子吗 您可以使用http 拦截器 https pub dev packages http interce
  • UNIX/MacOS 上静态文件的“临时 Web 服务器”?

    是否有一个像小型网络服务器这样的东西 我可以从命令行调用它 只从本地文件系统获取文件并通过特定端口上的 HTTP 为它们提供服务 我希望能够做这样的事情 cd Sites mysite serve 10 0 1 1 8080 这应该会启动一

随机推荐

  • 使用 Zend 进行领域驱动设计

    这个问题是我之前问题的延续zend 模型架构 https stackoverflow com questions 2122850 zend models architecture 非常感谢比尔 卡尔文 我读过一些书 包括这篇文章 http
  • 在 Python 中打印时处理 NoneType 对象的好方法

    如何在 Python 中打印 NoneType 对象 score can be a NonType object logging info NEW SCORE score 另外 为什么有时我会看到逗号而不是上面的 最好的方法是 loggin
  • 跟踪数组中的最小数字

    我试图跟踪最低数字的分数 如果我找到这些玩家的最低分数 我不希望他们在下一轮中再次参加比赛 我已经到了将那些低玩家价值存储到数组中的地步 但我只想将它们存储一次 for int i 0 i lt player length i for in
  • 回收者视图内动态视图的问题

    我正在使用回收器视图来显示包含图像网格布局的项目列表 网格布局动态添加到回收器视图适配器上 onBindViewHolder 方法内的列表项 现在的问题是 每次滚动时都会重新创建网格布局视图 我不希望在滚动时重新创建这些视图 怎么处理呢 这
  • 多个附件 django 电子邮件

    您好 我尝试发送带有多个附件的电子邮件 如 pdf xml 等 但出现错误 list object has no attribute rfind 这是我的代码 from security views import SendEmail Env
  • 我们如何显示来自 Picasa java API 的照片?

    好吧 这似乎是一个愚蠢的问题 因为我们有this http code google com intl en apis picasaweb docs 2 0 developers guide java html 但是 到目前为止 我只能使用以
  • 传递 MethodHandles.lookup().lookupClass() 与传递 Class 到 getLogger 方法

    我最近遇到了一个声明如下的记录器 private static final Logger logger LoggerFactory getLogger MethodHandles lookup lookupClass 与像这样 正常 声明相
  • Symfony2.1 - 使用 DataTransformer 时选项“em”不存在

    我在用this http symfony com doc master cookbook form data transformers html在 Symfon 2 1 中添加数据转换器的食谱食谱 但我收到以下错误 The option e
  • _GLIBCXX_USE_CXX11_ABI 在 RHEL6 和 RHEL7 上禁用?

    我在 RHEL6 和 RHEL7 上安装了 gcc 5 2 1 看起来 GLIBCXX USE CXX11 ABI 被禁用了 即使我手动运行也不起作用 D GLIBCXX USE CXX11 ABI 1 std c 14 这意味着我不会获得
  • 从 django 循环中提取值

    我有一个 Django 应用程序 我在模板中使用以下内容 load mptt tags ul recursetree nodes li node name if not node is leaf node ul class children
  • 如何运行量角器?

    我对量角器很陌生 我在 Windows 命令行中运行它 我按照这个教程进行操作https github com angular protractor blob master docs getting started md https git
  • IBM Worklight - 在服务器端包含 JavaScript 库

    我正在使用 IBM Worklight 构建移动应用程序 在适配器中 我需要使用第三方 JavaScript 文件提供的一些功能 我想知道是否可以在服务器上包含这样的文件 如果不是 还有什么替代方案 目前无法在适配器代码中包含外部 Java
  • Spring REST API 中的 Json 模式验证

    我正在使用 Spring Boot 和 jackson module jsonSchema 构建 REST API https github com FasterXML jackson module jsonSchema https git
  • 为具有相同类的元素添加点击事件监听器

    我有一个删除 id 的列表视图 我想为具有特定类的所有元素添加一个侦听器 并执行确认警报 我的问题是 这似乎只将侦听器添加到它找到的类的第一个元素 我尝试使用querySelectorAll但没有成功 var deleteLink docu
  • 将命令行 tf checkin 链接到工作项

    我想通过以下方式将文件提交到 TFS 存储库tf命令行工具并将提交链接到 TFS 工作项 我该怎么做 我已经提交了我的文件 但没有指向工作项目的链接 我的命令添加一个新文件并提交更改 gt tf add foo cpp gt tf chec
  • 如何使用 Zeppelin 访问 aws spark-ec2 集群和 s3 存储桶

    我有一个通过 Spark ec2 脚本设置的 aws ec2 集群 我想配置 Zeppelin 以便我可以在 Zeppelin 本地编写 scala 代码并在集群上运行它 通过 master 此外 我希望能够访问我的 s3 存储桶 我跟着本
  • 无法加载文件或程序集>'System.Windows,版本=2.0.5.0

    首次加载 Silverlight 应用程序时 我不断收到此错误 无法加载文件或程序集 系统 Windows 版本 2 0 5 0 文化 中立 PublicKeyToken 7cec85d7bea7798e 或 它的依赖项之一 系统 找不到指
  • 我应该记录类似函数签名的参数吗?

    我有一些辅助函数 除了第一个参数之外 它们采用与核心函数相同的参数 这些参数被完整记录在核心函数中 我是否也应该将此文档复制粘贴到辅助函数中 或者只是指向核心文档 重要的是 我主要希望将我的 API 参考作为 Sphinx 生成的 HTML
  • 获取列表框中所选项目的文本

    我试图在消息框中显示 listBox1 的选定项目 代码如下 int index string item foreach int i in listBox1 SelectedIndices index listBox1 SelectedIn
  • 使用 Spring 的 @RequestBody 并随后读取 HttpServletRequest.getInputStream()

    我正在使用 Spring 将请求的 JSON POST 数据映射到一个对象中 RequestBody注释和MappingJacksonHttpMessageConverter 但之后我想读取数据String表单进行一些额外的身份验证 但是当