精华内容
下载资源
问答
  • 解决拦截器中获取requestbody之后在controller中获取不到requestbody的问题

    解决拦截器中获取了requestbody之后在controller中获取不到requestbody的问题

    参考文章:

    (1)解决拦截器中获取了requestbody之后在controller中获取不到requestbody的问题

    (2)https://www.cnblogs.com/oushiyang/p/9760827.html


    备忘一下。


    展开全文
  • 后端controller可以使用FromBody获取参数,如果参数是比较简单的字符串,可以使用[FromBody]string data, 如果是比较复杂的json,可以转换为对象,对象的属性和json对应即可。 例如前台发送数据为: {username:...

    后端controller可以使用FromBody来获取参数,如果参数是比较简单的字符串,可以使用[FromBody]string data, 如果是比较复杂的json,可以转换为对象,对象的属性和json对应即可。
    例如前台发送数据为:
    {username:‘aa’, password:‘1’}
    后台可定义一个UserInfo类

    public class UserInfo
    {
    	public string username {get;set;}
    	public string password {get;set;}
    }
    [HttpPost("[action]")]
    public void SaveTestInfo([FromBody]UserInfo data)
    {
    
    }
    
    展开全文
  • SpringMVC在Controller前取出body参数导致@RequestBody值为空的解决方案问题的产生环境问题的产生的原因解决方案 问题的产生环境 经常有需要需要在访问到具体的接口前需要对请求过来的参数做一些处理,比如用户权限...

    SpringMVC在Controller前取出body参数导致@RequestBody值为空的解决方案

    问题的产生环境

    经常有需要需要在访问到具体的接口前需要对请求过来的参数做一些处理,比如用户权限校验,入参打印之类的。一般我们都会使用Filter,Interceptor里面的preHandle去操作。如果是url的话还好request.getParameter(“xxx”)就能取出想要的值,但是如果在body里面,那自然会想request.getInputStream()去读取body。当你写好了代码开开心心去测得的时候就会发现在controller里面的@RequestBody却报了一个空的错误。

    问题的产生的原因

    那是因为流对应的是数据,数据放在内存中,有的是部分放在内存中。read 一次标记一次当前位置(mark position),第二次read就从标记位置继续读(从内存中copy)数据。 所以这就是为什么读了一次第二次是空了。 怎么让它不为空呢?只要inputstream 中的pos 变成0就可以重写读取当前内存中的数据。javaAPI中有一个方法public void reset() 这个方法就是可以重置pos为起始位置,但是不是所有的IO读取流都可以调用该方法!ServletInputStream是不能调用reset方法,这就导致了只能调用一次getInputStream()。

    解决方案

    知道原因后大家肯定很容易想到解决方案,就是把request里的流取出来保存起来,后面读取的时候都去读这个变量就好了。这个方案网上有很多,是借助重写HttpServletRequestWrapper 类即可。在类初始化的时候取出值,在getInputStream改变读取来源。网上代码参考
    这是个解决方法。但是我的要求其实很低,只要在controller取一下就好了。之前的方案都是在SpringMVC的生命周期里做文章。那我能否在@RequestBody映射好之后,controller方法执行之前去取得话就不会你操作inputstream了。这种场景aop就登场了。

    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.util.StringUtils;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.Arrays;
    
    @Aspect
    @Component
    public class CustomLogAspect {
    
        private static final Logger LOG = LoggerFactory.getLogger(CustomLogAspect.class);
    
        @Pointcut("execution(public * com.hao.controller.TestController.test*(..))")
        public void webLog() {
        }
    
        @Before("webLog()")
        public void doBefore(JoinPoint joinPoint) throws Throwable {
            // 开始打印请求日志
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            String deviceNum= request.getParameter("deviceNum");
            if (StringUtils.isEmpty(deviceNum) || "null".equals(deviceNum)) {
                Object[] args = joinPoint.getArgs();
                for (Object arg : args) {
    				if(arg instanceof TaskBody){
                        deviceNum = ((TaskBody) arg).getDeviceNum();
                    }
                }
                if (StringUtils.isEmpty(deviceNum) || "null".equals(deviceNum)){
                    deviceNum ="now:"+System.currentTimeMillis();
                }
            }
        }
    
    }
    

    在这里request的内容我直接用RequestContextHolder里面获取request对象取,body里面的值我从joinPoint.getArgs()从切的方法参数里面取,这样是不是也很简单。如果有符合这样的场景的,也可以试试。

    展开全文
  • 想要好用的可以去百度找,这只是个获取RequestBody数据的方法。 并没有解决其可能导致的问题。 传送门:拦截器中查看body /** * 获取body数据,但是会关闭流, * 想不关闭,需要创建一个...

    只是个获取的方法,没测试会不会产生什么问题
    想要好用的可以去百度找
    传送门:拦截器中查看body

        /**
         * 获取body数据
         *
         * @param request
         * @return
         * @throws IOException
         */
        public String getBodyString(HttpServletRequest request) throws IOException {
            StringBuilder sb = new StringBuilder();
            InputStream inputStream = null;
            BufferedReader bufferedReader = null;
            try {
                inputStream = request.getInputStream();
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
    
                char[] bodyCharBuffer = new char[1024];
                int len = -1;
                while ((len = bufferedReader.read(bodyCharBuffer)) != -1) {
                    sb.append(new String(bodyCharBuffer, 0, len));
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 关闭流
                if (bufferedReader != null) {
                    try {
                        bufferedReader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                // if (inputStream != null) {
                //     try {
                //         inputStream.close();
                //     } catch (IOException e) {
                //         e.printStackTrace();
                //     }
                // }
            }
            return sb.toString();
        }
        ```
    
    展开全文
  • HttpHelper 获取 request body public class HttpHelper { private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class); /** * get request Body * */ public static String ...
  • POST、GET、@RequestBody和@RequestParam区别

    万次阅读 多人点赞 2019-08-15 21:26:43
    注解@RequestParam接收的参数是来自requestHeader中,即请求头。 RequestParam可以接受简单类型的属性,也可以接受对象类型。 @RequestParam有三个配置参数: required 表示是否必须,默认为 true,必须。 ...
  • InputStream; import java.io.InputStreamReader; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest;... * 流的方式获取JSON数据 */ public class Requ
  • @RequestBody @RequestBody 等参数说明

    千次阅读 2018-12-02 22:40:21
    1、处理request body部分的注解 :@RequestParam, @RequestBody 2、处理request header部分的注解: @RequestHeader, @CookieValue 3、处理requet uri 部分(这里指uri template中variable,不含queryString部分...
  • 本文代码 ...    总有些时候我们希望获得Request body 的纯文本 那么怎么做呢?很简单。如下所示 public string GetJsonString([FromBody]string content) { ret...
  • 如今越来越多的项目基于Springboot进行开发,在项目中拦截器的使用是不可缺少的,因为需要对body中的进行校验,例如加密验签、防重复提交、内容校验等等,对于可以多次读取body的解决方案如下: 1 新建...
  • 在无法使用spring提供的增强方法时,可以自定义实现打印request body入参 @Aspect @Component @Slf4j public class ControllerAspect { private final HttpServletRequest request; public ControllerAspect...
  • 在用户有大量http请求的时候,springboot 通过 Controller 获取 http 上传的数据,获取 http body 中 的数据,发现http body 中的数据与用户上传的http body中的数据不一致,通过分析发现,使用tcpdump 在网卡捕获的...
  • //@RequestBody处理,必须是JSON格式,且是JSON字符串 contentType :"application/json",data : JSON.stringify(data), let data = { data : { name : "啊啊" } , departmentVO : { code...
  • @RequestBody 接收不到

    千次阅读 2020-03-30 17:15:12
    实体属性跟传参不一样也就算了,一样为什么...,扯这些没用, 加个艾特JsonProperty(value="xxx")吧,好像就是命名不规的样子 @RequestBody GeneralParam generalParam 转存失败重新上传取消 转存失败重新上传取消
  • SpringMVC @RequestBody注解

    2018-08-08 13:37:36
    SpringMVC @RequestBody注解 @PostMapping("/2") public String user2String(@RequestBody User user){ return user.toString(); } @requestBody注解常用来处理content-type不是默认的application/x-...
  • 关于@RequestBody

    2020-07-01 11:34:55
    如果是前端传一个{“userName”:“A”,“ passWord”:“B”} JOSN字符串,后端可以直接用@@RequestBody String username 来获取值 (2)后端也可以用@RequestBody User user来接收,mvc框架自动封装进去,user里面...
  • 在使用AOP编程的时候,经常碰到需要多次获取整个请求的body的情况。例如:典型场景下我们要在AOP切面中做日志记录或权限校验,此时需要调用request.getInputStream获取输入流,从而读取整个请求的消息体。但是这通常...
  • @RequestBody注解分析

    千次阅读 2021-01-14 22:56:45
    @RequestBody注解风析 1.@RequestBody 1.1用途: 用于接收前端传递给后端的json字符串中的数据。 @RequestBody用来接收前端传递给后端的json字符串中的数据,因为GET方式的请求没请求体(GET只能URL中携带key-value...
  • 首先说明: (一)首先说明xia @requestBody与@requestParam的区别 spring的RequestParam注解接收的参数是...RequestBody注解接收的参数则是来自于requestBody中,即请求体中。 知识点: (二)Content-Type...
  • @RequestBody获取不到参数

    千次阅读 2020-08-29 00:03:08
    问题:前端数据发送出去,后端接口没问题,但@RequestBody获取对象参数为Null. 验证后端接口没问题,再往下解决。(通过swagger或者postman能获取接口返回数据) 查看前端发送的请求 import request from '@/utils...
  • 背景 最近在项目中遇到需要统一对Request请求中的某一个自定义对象的属性进行统一修改的需求。...在不经过拿取流的情况下,spring的RequestBody注解也是通过getInputStream()方法来获取流来映射为.
  • 一、前言 通过request.getInputStream();的方式获取body参数实现起来...参考:spring boot aop 中获取requestbody参数 二、打印结果 2020-07-23 14:04:41.194 |-INFO [http-nio-8080-exec-1] com.asyf.demo.con...
  • 非form表单提交的数据就要用@requestbody注解获取http传过来的,尤其json
  • 可能会是以下原因: 没有使用@PostMapping 请求数据格式不是 application/json (在请求头中加上 Content-Type: application/json)
  • SpringBoot Controller 中使用多个@RequestBody的正确姿势

    万次阅读 多人点赞 2018-08-27 21:31:49
    最近遇到Controller中需要多个@RequestBody的情况,但是发现并不支持这种写法, 这样导致 1、单个字符串等包装类型都要写一个对象才可以用@RequestBody接收; 2、多个对象需要封装到一个对象里才可以用@Request...
  • SpringBoot MVC实现自定义RequestBody注解

    千次阅读 2019-01-02 14:48:38
    一、MVC实现RequestBody注解源码解析 1. @RequestBody 源码: @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestBody { /** ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 182,216
精华内容 72,886
关键字:

获取requestbody值