1. package com.lb.demo.listener;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.ByteArrayInputStream;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;
  7.  
  8. import javax.servlet.ReadListener;
  9. import javax.servlet.ServletInputStream;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletRequestWrapper;
  12. /××××
    ×
    ×
    ×
    ×添加此类
    ×
    ×
    ×
    ×××××××/
  13. public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
  14.  
  15. private final byte[] body; // 用于保存读取body中数据
  16.  
  17. public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
  18. super(request);
  19. StringBuffer sb=new StringBuffer();
  20. String temp=null;
  21. BufferedReader bufferread = request.getReader();
  22. while((temp=bufferread.readLine())!=null) {
  23. sb.append(temp);
  24. }
  25. body = sb.toString().getBytes();
  26. bufferread.close();
  27. }
  28.  
  29. @Override
  30. public BufferedReader getReader() throws IOException {
  31. return new BufferedReader(new InputStreamReader(getInputStream()));
  32. }
  33.  
  34. @Override
  35. public ServletInputStream getInputStream() throws IOException {
  36. final ByteArrayInputStream bais = new ByteArrayInputStream(body);
  37. return new ServletInputStream() {
  38.  
  39. @Override
  40. public int read() throws IOException {
  41. return bais.read();
  42. }
  43.  
  44. @Override
  45. public boolean isFinished() {
  46. // TODO Auto-generated method stub
  47. return false;
  48. }
  49.  
  50. @Override
  51. public boolean isReady() {
  52. // TODO Auto-generated method stub
  53. return false;
  54. }
  55.  
  56. @Override
  57. public void setReadListener(ReadListener arg0) {
  58. // TODO Auto-generated method stub
  59.  
  60. }
  61. };
  62. }
  63. }
  1. package com.lb.demo.listener;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5.  
  6. import javax.servlet.FilterChain;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletRequest;
  9. import javax.servlet.ServletResponse;
  10. import javax.servlet.http.HttpFilter;
  11. import javax.servlet.http.HttpServletRequest;
  12.  
  13. import org.apache.commons.logging.Log;
  14. import org.apache.commons.logging.LogFactory;
  15. import org.springframework.stereotype.Component;
  16. /××××
    ×
    ×
    ×
    ×修改 Filter
    ×
    ×
    ××××××××××/
  17. @Component
  18. public class MyServletFilter extends HttpFilter {
  19.  
  20. String param = "";
  21. private Log log = LogFactory.getLog(MyServletFilter.class);
  22.  
  23. public void destroy() {
  24. // TODO Auto-generated method stub
  25.  
  26. }
  27.  
  28. @Override
  29. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  30. throws IOException, ServletException {
  31. ServletRequest requestWrapper = null;
  32. requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request); // 替换
  33. param = this.getBodyString(requestWrapper.getReader());
  34. log.info("filter读取body中的参数>>>>>>>>>" + param);
  35. chain.doFilter(requestWrapper, response);
  36. }
  37.  
  38. public static String getBodyString(BufferedReader br) {
  39. String inputLine;
  40. String str = "";
  41. try {
  42. while ((inputLine = br.readLine()) != null) {
  43. str += inputLine;
  44. }
  45. br.close();
  46. } catch (IOException e) {
  47. System.out.println("IOException: " + e);
  48. }
  49. return str;
  50. }
  51. }

解决 springweb Filter 读取request body miss body的更多相关文章

  1. 解决filter拦截request中body内容后,字符流关闭,无法传到controller的问题

    解决filter拦截request中body内容后,字符流关闭,无法传到controller的问题 2.问题: 在一般的请求中,content-type为:application/x-www-form ...

  2. 深入探究ASP.NET Core读取Request.Body的正确方式

    前言 相信大家在使用ASP.NET Core进行开发的时候,肯定会涉及到读取Request.Body的场景,毕竟我们大部分的POST请求都是将数据存放到Http的Body当中.因为笔者日常开发所使用的 ...

  3. ASP.NET Core 中读取 Request.Body 的正确姿势

    ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream —— 不允许 Request.Body.Position=0 ,这就意味着只能 ...

  4. SpringBoot 解决HttpServletRequest只能读取一次

    业务逻辑,通过filter读取请求的request,获取token,并将token传递后面流程使用 BodyReaderHttpServletRequestWrapper: public class ...

  5. 如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容?

    原文:如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容? 文章名称: 如何在ASP.NET Core自定义中间件读取Request.Body和 ...

  6. ASP.NET Core 2.0 中读取 Request.Body 的正确姿势

    原文:ASP.NET Core 中读取 Request.Body 的正确姿势 ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream ...

  7. java读取request中的xml

    java读取request中的xml   答: // 读取xml InputStream inputStream; StringBuffer sb = new StringBuffer(); inpu ...

  8. Java解决大文件读取的内存问题以及文件流的比较

    Java解决大文件读取的内存问题以及文件流的比较 传统方式 读取文件的方式一般是是从内存中读取,官方提供了几种方式,如BufferedReader, 以及InputStream 系列的,也有封装好的如 ...

  9. ASP.NET Core重复读取Request.Body

    //HttpContext context.Request.EnableRewind(); //创建缓冲区存放Request.Body的内容,从而允许反复读取Request.Body的Stream u ...

随机推荐

  1. C/C++贪心算法解决TSP问题

    贪心算法解决旅行商问题 TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出.问题描述如下: 有若干 ...

  2. redis报错MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist

    解决方法:通过redis-cli连接到服务器后执行以下命令: config set stop-writes-on-bgsave-error no 注意:这种方法只是忽略了问题,并没有解决问题,具体问题 ...

  3. Java并发读书笔记:线程通信之等待通知机制

    目录 synchronized 与 volatile 等待/通知机制 等待 通知 面试常问的几个问题 sleep方法和wait方法的区别 关于放弃对象监视器 在并发编程中,保证线程同步,从而实现线程之 ...

  4. /和//的区别(python)

    /  除 得到的是浮点数,结果是大数的时候会使用科学计数法 但是 / 会在遇到大数时候运算不准确 因为将两个int相除会产生一个浮点数,并且除法的确切结果不能精确地表示为float. 精确结果必须四舍 ...

  5. (转)深入理解JVM—JVM内存模型

    原文地址:http://www.cnblogs.com/dingyingsi/p/3760447.html 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互 ...

  6. Java 统计整数二进制中1的个数

    package cookie; public class CountBinary_1 { public static void main(String[] args) { System.out.pri ...

  7. MySQL过程和游标

    BEGIN DECLARE f_leastCount INT DEFAULT 100; DECLARE f_ratio FLOAT DEFAULT 0.8; DECLARE i_channel VAR ...

  8. javaBean命名属性时的小注意点

    javabean属性命名的时,第一个和第二个字母最好不要是大写字母,不然使用eclipse自动生成getter和setter方法时,会出现奇怪的问题,导致struts2封装属性的封装不上. priva ...

  9. vue使用Vant UI中的swiper组件及传值

    子组件SwiperBanner <!-- --> <template> <div class="swiper"> <van-swipe : ...

  10. (六--二)scrapy框架之持久化操作

    scrapy框架之持久化操作 基于终端指令的持久化存储 基于管道的持久化存储 1 基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过 ...