iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot过滤器如何获取POST请求的JSON参数
  • 893
分享到

SpringBoot过滤器如何获取POST请求的JSON参数

2024-04-02 19:04:59 893人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录SpringBoot过滤器获取POST请求的JSON参数想到了使用过滤器来实现这个功能所以我们可以通过获取到输入流来获取body从源码我们可以看到我们创建一个类并继承这个包装类有

springBoot过滤器获取POST请求的jsON参数

项目中需要将每个请求的路径和请求参数以及响应结果,都记录在日志中,这样在出现问题时可以快速定位是哪里出现了问题。

想到了使用过滤器来实现这个功能

当请求来到过滤器时,会有一个Request参数,通过该参数就能获取到请求路径和请求参数,以及相关内容


parameterMap = HttpRequest.getParameterMap();
String requestMethod = httpRequest.getMethod();
String remoteAddr = httpRequest.getRemoteAddr();
int remotePort = httpRequest.getRemotePort();

上面的getParameterMap(),只能够获取到GET请求的参数,如果是POST方法传的JSON那就没法获取到,那如何获取呢,POST的请求是在请求体body中,而POST请求中的body参数是已流形式存在的

所以我们可以通过获取到输入流来获取body


ServletInputStream inputStream = httpRequest.getInputStream();
InputStreamReader reader = new InputStreamReader(inputStream,StandardCharsets.UTF_8);
BufferedReader bfReader = new BufferedReader(reader);
StringBuilder sb = new StringBuilder();
String line;
while ((line = bfReader.readLine()) != null){
sb.append(line);
}
System.out.println(sb.toString());

通过上面的方法,我们确实能在过滤器中获取到POST的JSON参数了,但是按照上面的方法实现的过滤器,我们会发现,当请求经过过滤器来到Controller的时候,请求参数不见了

image-20201219133609844

可以看到,过滤器确实拿到JSON参数,但是接着报了一个request body missing的异常,也就是请求来到Controller时,参数没有了,这是为啥呢?我们先去源码看看,Controller平时是怎么拿到请求参数的吧

image-20201219134042794

根据DeBug,可以看到SpringBoot处理请求的最主要的两个方法是上图红框的doServicedoDisparch方法,上面就是通过反射去获取参数名去匹配等

来到invokeForRequest方法,这里面的getMethodArgumentValues,就是SpringBoot获取请求参数的入口,进入入口后

image-20201219135249418

再经过上面的红框,就能看到SpringBoot获取POST请求JSON的参数的真面目了

image-20201219135426586

从源码我们可以看到

SpringBoot也是通过获取request的输入流来获取参数,这样上面的疑问就能解开了,为什么经过过滤器来到Controller请求参数就没了,这是因为 InputStream read方法内部有一个,postion,标志当前流读取到的位置,每读取一次,位置就会移动一次,如果读到最后,InputStream.read方法会返回-1,标志已经读取完了,如果想再次读取,可以调用inputstream.reset方法,position就会移动到上次调用mark的位置,mark默认是0,所以就能从头再读了。但是呢 是否能reset又是由markSupported决定的,为true能reset,为false就不能reset,从源码可以看到,markSupported是为false的,而且一调用reset就是直接异常

image-20201219140007286

所以这也就代表,InputStream只能被读取一次,后面就读取不到了。因此我们在过滤器的时候,已经将InputStream读取过了一次,当来到Controller,SpringBoot读取InputStream的时候自然是什么都读取不到了

image-20201219140830451

既然InputStream只能读取一次,那我们可以把InputStream给保存下来,然后完整的传下去SpringBoot就可以读取到了,这里就需要用到httpservletRequest的包装类HttpServletRequestWrapper了,该类可以自定义一些方法

我们创建一个类并继承这个包装类


public class RequestWrapper extends HttpServletRequestWrapper {
    private final byte[] body;
    public RequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        //保存一份InputStream,将其转换为字节数组
        body = StreamUtils.copyToByteArray(request.getInputStream());
    }
	//转换成String
    public String getBodyString(){
        return new String(body,StandardCharsets.UTF_8);
    }
    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }
	//把保存好的InputStream,传下去
    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
        return new ServletInputStream() {
            @Override
            public int read() throws IOException {
                return bais.read();
            }
            @Override
            public boolean isFinished() {
                return false;
            }
            @Override
            public boolean isReady() {
                return false;
            }
            @Override
            public void setReadListener(ReadListener readListener) {
            }
        };
    }
}

通过保存一份流,就可实现在过滤器中能拿到JSON参数,同时Controller也不会丢失参数

image-20201219141929107

有一点需要注意的

在过滤器放行的时候,放行的是包装类和而不是原来的Request

image-20201219142124831

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: SpringBoot过滤器如何获取POST请求的JSON参数

本文链接: https://www.lsjlt.com/news/133866.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot过滤器如何获取POST请求的JSON参数
    目录SpringBoot过滤器获取POST请求的JSON参数想到了使用过滤器来实现这个功能所以我们可以通过获取到输入流来获取body从源码我们可以看到我们创建一个类并继承这个包装类有...
    99+
    2024-04-02
  • php如何获取post请求参数
    在PHP中,可以使用`$_POST`全局变量来获取POST请求中的参数。`$_POST`是一个关联数组,其中键是表单中的输入字段的名...
    99+
    2023-08-11
    php
  • springboot中不能获取post请求参数如何解决?
    这篇文章将为大家详细讲解有关springboot中不能获取post请求参数如何解决?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题描述最近在做微信小程序,用的spring boot做后端,突然发现客户...
    99+
    2023-05-30
  • 使用flask如何获取post请求参数
    目录前言概述1. application/jsonhttp 请求报文格式如下:使用curlpostman 请求flask如何获取请求体呢2. application/x-www-fo...
    99+
    2024-04-02
  • gin如何获取post请求的json body操作
    这篇文章主要介绍了gin如何获取post请求的json body操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。代码如下type KDRespBody ...
    99+
    2023-06-14
  • java如何获取post请求的请求体
    在Java中,可以使用Servlet或Spring框架来获取POST请求的请求体。1. 使用Servlet:- 在Servlet中重...
    99+
    2023-09-14
    java
  • SpringBoot如何获取Get请求参数详解
    目录前言一、直接在请求路径中二、参数跟在 号后面1,获取参数的基本方法2、使用 map 来接收参数3、接收一个集合4、通过对象接收参数总结前言 利用 Spring Boo...
    99+
    2022-12-08
    springboot get请求参数 spring boot获取请求参数 springboot 请求
  • gin 获取post请求的json body操作
    我就废话不多说了,大家还是直接看代码吧~ 代码如下 type KDRespBody struct { Errcode int `json:"errcode"` Des...
    99+
    2024-04-02
  • 使用SpringBoot请求参数过滤空格
    目录SpringBoot请求参数过滤空格1、参数修改SpaceHttpServletRequestWrapper2、空格过滤器3、过滤器初始化SpringBoot指定执行参数,参数值...
    99+
    2024-04-02
  • Node.js中怎么处理POST请求并获取请求参数
    本篇内容介绍了“Node.js中怎么处理POST请求并获取请求参数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!接收POST请求在Node....
    99+
    2023-07-05
  • SpringBoot如何接收Post请求Body里面的参数
    目录如何接收Post请求Body里的参数ApiPost测试数据Java接收数据SpringBoot获取参数常用方式参数在body体中PathVaribale获取url路径的数据Req...
    99+
    2024-04-02
  • java如何获取get请求参数
    在Java中,可以使用HttpServletRequest对象来获取GET请求参数。HttpServletRequest类是Java...
    99+
    2023-10-21
    java
  • php如何获取get请求参数
    在PHP中,可以通过超全局数组$_GET来获取GET请求参数。以下是一些示例:1. 获取单个GET请求参数:```php$id = ...
    99+
    2023-08-15
    php
  • jquery如何获取get请求的参数
    本篇内容介绍了“jquery如何获取get请求的参数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Web开发中,GET请求是非常常见的一种...
    99+
    2023-07-06
  • django如何获取get请求参数
    在Django中,可以通过`request.GET`来获取GET请求的参数。`request.GET`是一个类字典的对象,你可以通过...
    99+
    2023-09-26
    django
  • php如何获取json请求体
    要获取JSON请求体,您可以使用`file_get_contents('php://input')`函数来读取请求体的内容。以下是一...
    99+
    2023-08-26
    php json
  • php 获取请求参数的函数
    在 PHP 中,可以使用 $_GET、$_POST 和 $_REQUEST 来获取请求参数。以下是介绍它们的一些细节: $_GET 用于获取通过 URL 传递的参数,一般用于获取请求方式为 GET ...
    99+
    2023-09-01
    php 开发语言
  • Filter中获取传递参数方式(解决post请求参数问题)
    目录Filter中获取传递参数1.GET传递2.Post传递XyRequestWrapper类XySecurityFilterFilter中获取传递参数 1. GET 传递 参数可以...
    99+
    2024-04-02
  • 如何使用java过滤器获取所有参数值
    要使用Java过滤器获取所有参数值,可以按照以下步骤进行操作:1. 创建一个类实现`javax.servlet.Filter`接口,...
    99+
    2023-09-06
    java
  • SpringBoot项目拦截器获取Post方法的请求body实现
    1). 存在问题流只能读取一次 2). 目标多次读取流 3). 解决方法创建包装类 4). RequestWrapper package com.mazaiting.redeye.w...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作