当前位置: 首页 > news >正文

kotlin使用spring mvc(三)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Filter中读取输入流

在很多场景中,我们需要读取接口调用方的原始报文,以方便出现问题的时候进行对质、修复,但是在spring mvc中的输入流只允许读取一次,在Filter中读取之后action中就无法就行绑定了,如下面的代码

if(request != null){
            //读取原始报文
            val originText = request.inputStream.bufferedReader().readText()
            println(originText)
            chain?.doFilter(request,response)
        }

这样在模型绑定的时候直接抛出

Required request body is missing

按照常理上思维,输入流读取到最后,我重置不就行了吗,事实上尝试之后发现不可行,spring mvc根本没有实现,那我们只能自己造轮子了

class ResettableStreamHttpServletRequest(val request: HttpServletRequest) : HttpServletRequestWrapper(request) {
   //把输入流缓存到字节数组
    private val rawData: ByteArray = IOUtils.toByteArray(this.request.inputStream)
	//可重置的输入流对象
    private val servletStream: ResettableServletInputStream

    init {
	     //初始化的时候就把缓存的字节数组读到流中
        servletStream = ResettableServletInputStream(ByteArrayInputStream(rawData))
    }

    internal fun resetInputStream() {
	    //重置的时候,重新构造一个输入流对象
        servletStream.stream = ByteArrayInputStream(rawData)
    }

    override fun getInputStream(): ServletInputStream {
        return servletStream
    }

    override fun getReader(): BufferedReader {
        val encoding = characterEncoding
        return if (encoding != null) {
            BufferedReader(InputStreamReader(servletStream, encoding))
        } else {
            BufferedReader(InputStreamReader(servletStream))
        }
    }


}
//必须定义一个ServletInputStream,它没有提供公开的构造方法
 class ResettableServletInputStream(var stream: InputStream) : ServletInputStream() {
    override fun isReady(): Boolean {
        return true
    }

    override fun isFinished(): Boolean {
        return false
    }

    override fun setReadListener(listener: ReadListener?) {

    }
    override fun read(): Int {
        return stream.read()
    }
}

在Filter中使用ResettableStreamHttpServletRequest

        val resettableStreamHttpServletRequest = ResettableStreamHttpServletRequest(request = request as HttpServletRequest)
        //读取原始报文
        val orginText = resettableStreamHttpServletRequest.inputStream.bufferedReader().readText()
        println(orginText)
        resettableStreamHttpServletRequest.resetInputStream()

        chain?.doFilter(resettableStreamHttpServletRequest,response)

转载于:https://my.oschina.net/weidedong/blog/2249400

相关文章:

  • 在Ubuntu 11.04中安装Openresty
  • Nginx 部署HTTPS
  • 浅谈IP地址-1
  • Rafy 领域实体框架演示(2) - 新功能展示
  • 高程读书笔记 第六章 面向对象程序设计
  • oracle常用操作语句
  • 搞定面试官
  • 使用WPF实现3D场景[一]
  • 初识MongoDB
  • STM32之CAN ---CAN ID过滤器分析
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 进制之间的相互转换
  • 值得推荐的10本PHP书籍(转)
  • C文件操作
  • 深入理解ReactRedux
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 《Java编程思想》读书笔记-对象导论
  • Android单元测试 - 几个重要问题
  • httpie使用详解
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript 奇技淫巧
  • JavaScript 一些 DOM 的知识点
  • java正则表式的使用
  • js继承的实现方法
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Python利用正则抓取网页内容保存到本地
  • storm drpc实例
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从tcpdump抓包看TCP/IP协议
  • 大型网站性能监测、分析与优化常见问题QA
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 力扣(LeetCode)357
  • 盘点那些不知名却常用的 Git 操作
  • 微信小程序设置上一页数据
  • 学习ES6 变量的解构赋值
  • 用Canvas画一棵二叉树
  • 云大使推广中的常见热门问题
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​如何防止网络攻击?
  • #数学建模# 线性规划问题的Matlab求解
  • ()、[]、{}、(())、[[]]命令替换
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (4.10~4.16)
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (九)信息融合方式简介
  • (转)负载均衡,回话保持,cookie
  • (转)甲方乙方——赵民谈找工作
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 4.0中的泛型协变和反变
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?