如何从request中获取body的数据

 更新时间:2023年11月18日 15:53:00   作者:月未明  
这篇文章主要介绍了如何从request中获取body的数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

从request中获取body的数据

如果在controller里直接@RequestBody就可以获取,这种方式很简单,现在说下直接从request中获取。

说下场景

我是在shiro的filter中获取body中的数据:

@Override
    public boolean onAccessDenied(ServletRequest servletRequest, ServletResponse response) throws Exception{
        log.info("into onAccessDenied");
        try {
            HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;

            String str = httpServletRequest.getQueryString();
            BufferedReader bufferedReader = httpServletRequest.getReader();
            String bodyStr = IOUtils.read(bufferedReader);
            System.out.println("bodyStr = " + bodyStr );
            return true;
        }catch (ExpiredCredentialsException e){
            log.info("请求信息过期");
            WebUtils.toHttp(response).sendError(401,"请求信息过期,操作失败");
        }catch (Exception e){
            log.info("请求参数不合法");
            e.printStackTrace();
            WebUtils.toHttp(response).sendError(401,e.getMessage());
        }

        return false;
    }

这里给出主要的相关代码,IOUtils是dubbo的一个类

相关依赖如下:

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
        </dependency>

通过这种方式获取的是一个json字符串,

bodyStr =  {
    "timestamp":1523966342156
}

因为我项目中没有用到dubbo,如果为了一个body的解析引入这个感觉有些不太合适,而且启动的时候也没有正常启动,所以我把这块代码抽取了出来:

package com.test.shiro.util;

import java.io.IOException;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;

/**
 * @author Created by pangkunkun on 2018/4/20.
 * 这段代码来自dubbo
 *
 */
public class RequestBodyUtils {

    private static final int BUFFER_SIZE = 1024 * 8;

    /**
     * read string.
     *
     * @param reader Reader instance.
     * @return String.
     * @throws IOException
     */
    public static String read(Reader reader) throws IOException
    {
        StringWriter writer = new StringWriter();
        try
        {
            write(reader, writer);
            return writer.getBuffer().toString();
        }
        finally{ writer.close(); }
    }

    /**
     * write.
     *
     * @param reader Reader.
     * @param writer Writer.
     * @return count.
     * @throws IOException
     */
    public static long write(Reader reader, Writer writer) throws IOException
    {
        return write(reader, writer, BUFFER_SIZE);
    }

    /**
     * write.
     *
     * @param reader Reader.
     * @param writer Writer.
     * @param bufferSize buffer size.
     * @return count.
     * @throws IOException
     */
    public static long write(Reader reader, Writer writer, int bufferSize) throws IOException
    {
        int read;
        long total = 0;
        char[] buf = new char[BUFFER_SIZE];
        while( ( read = reader.read(buf) ) != -1 )
        {
            writer.write(buf, 0, read);
            total += read;
        }
        return total;
    }

}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中的JSONObject使用及错误处理详解

    Java中的JSONObject使用及错误处理详解

    这篇文章主要给大家介绍了关于Java中的JSONObject使用及错误处理的相关资料,文中讲解了Java中的JSONObject创建、基本操作、高级特性和错误处理,通过示例代码和方法说明,使读者能够理解和掌握JSONObject的使用技巧,需要的朋友可以参考下
    2024-12-12
  • java自定义封装StringUtils常用工具类

    java自定义封装StringUtils常用工具类

    这篇文章主要为大家详细介绍了java自定义封装StringUtils常用工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 使用ShardingJDBC进行数据分片以及读写分离

    使用ShardingJDBC进行数据分片以及读写分离

    ShardingJDBC是一个轻量级的Java框架,提供了数据分片、读写分离、分布式主键生成等数据访问功能,本文将给大家介绍如何使用ShardingJDBC进行数据分片以及读写分离,需要的朋友可以参考下
    2024-01-01
  • Java之并行流(Parallel Stream)使用详解

    Java之并行流(Parallel Stream)使用详解

    Java并行流(ParallelStream)通过多线程并行处理集合数据,利用Fork/Join框架加速计算,适用于大规模数据集和计算密集型任务,并行流主要通过集合的parallelStream()方法或现有流的parallel()方法创建,适用于数据量大、计算复杂且无状态操作的场景
    2025-03-03
  • SpringBoot详细讲解异步任务如何获取HttpServletRequest

    SpringBoot详细讲解异步任务如何获取HttpServletRequest

    在使用框架日常开发中需要在controller中进行一些异步操作减少请求时间,但是发现在使用@Anysc注解后会出现Request对象无法获取的情况,本文就此情况给出完整的解决方案
    2022-04-04
  • Java设计模式之适配器模式的示例详解

    Java设计模式之适配器模式的示例详解

    适配器模式,即将某个类的接口转换成客户端期望的另一个接口的表示,主要目的是实现兼容性,让原本因为接口不匹配,没办法一起工作的两个类,可以协同工作。本文将通过示例详细介绍适配器模式,需要的可以参考一下
    2022-08-08
  • Struts2学习笔记(5)-参数传递方法

    Struts2学习笔记(5)-参数传递方法

    本文主要介绍Struts2中参数传递方法,希望能给大家做一个参考。
    2016-06-06
  • Redis中String字符串和sdshdr结构体超详细讲解

    Redis中String字符串和sdshdr结构体超详细讲解

    这篇文章主要介绍了Redis中String字符串和sdshdr结构体,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-04-04
  • SpringCloud中的Seata基本介绍与安装教程

    SpringCloud中的Seata基本介绍与安装教程

    Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务,这篇文章主要介绍了SpringCloud之Seata基本介绍与安装,需要的朋友可以参考下
    2024-01-01
  • Java高级-反射&动态代理详解

    Java高级-反射&动态代理详解

    这篇文章主要介绍了Java高级-反射&动态代理详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03

最新评论