zoukankan      html  css  js  c++  java
  • Request Payload 后台拦截器读取入参方式

    1:具体步骤 写个类继承HttpServletRequestWrapper  ( 读取流---将读出的流数据重新写入到流里 ---重写getReader读出流--写个getbody将变量读出)

      这样流里有数据  ,变量也有数据 

    2:下面是完整代码

    package org.gocom.components.coframe.auth.intercepter;

    import java.io.BufferedReader;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;

    import javax.servlet.ServletInputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    /**
    * 1 通过构造方法将流里的内容读出 赋值给变量 body
    * 2: 重写父类的getInputStream()方法 , 将读出的数据重新写入到流里
    * 3: 重写父类 getReader() 读出流里的数据
    * 4: 写个getbody方法将变量body返回出去
    * 通过上面3步 , 将流里的数据读出赋值给了变量body , 又将数据写入到流里
    * 在拦截器里面生成的HttpServletRequest里面流里有数据 ,变量body也有数据 , 
    *
    */
    public class MultiReadHttpServletRequest extends HttpServletRequestWrapper {

    public String body;


    //通过构造方法读取出流的内容
    public MultiReadHttpServletRequest(HttpServletRequest request) throws IOException {
    super(request);
    StringBuffer sBuffer = new StringBuffer();
    BufferedReader bufferedReader = request.getReader();
    String line;
    while ((line = bufferedReader.readLine()) != null) {
    sBuffer.append(line);
    }
    body = sBuffer.toString();

    }
    //重写父类 getInputStream方法 ,将读取的内容重新写入流,这步主要是将读出的数据重新写入到流中 , 不然 其他地方是获取不到的
    @Override
    public ServletInputStream getInputStream() {
    final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
    return new ServletInputStream() {
    @Override
    public int read() {
    return byteArrayInputStream.read();
    }
    };
    }
    //重写 getReader 方法将重写的流的内容读出,  框架读取request里的值有一些用的这个方法,

    //这里重写了这个方法后,框架里引用这个方法的地方不受影响,不然就是有的接口 获取不到入参 


    @Override
    public BufferedReader getReader() {
    return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }

    public String getBody() {
    return body;
    }
    }

    3: 在拦截器里面 使用的方式,拦截器中生成request 用下面方法 ,拦截器中用到request的地方都用下面方法新生成的request 

                                                      HttpServletRequest request= new MultiReadHttpServletRequest(httpReq);   

                                                       String body = ((MultiReadHttpServletRequest) request).getBody();  

        这样新生成的 request 流中有数据 ,变量body也有数据 ,  后续拦截器中用到request的地方都用这个新生成的

  • 相关阅读:
    Http Get Post put delete
    YII AR查询方法
    YII CJson类
    Yii 配置文件
    linux大文件分割 split命令
    chrome插件 postman插件 接口测试、API & HTTP 请求调试工具
    Yii 实现restful
    restful理解
    how tomcat works 读书笔记(一)----------一个简单的webserver
    HDU2206 IP的计算 【经典题】
  • 原文地址:https://www.cnblogs.com/xueershewang/p/15397034.html
Copyright © 2011-2022 走看看