热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解决springboot只能获取一次post请求的body数据

解决springboot只能获取一次post请求的body数据自定义一个类继承HttpServletRequestWrapper创建一个拦截器自定义一个类继承HttpServle

解决springboot只能获取一次post请求的body数据

  • 自定义一个类继承 HttpServletRequestWrapper
  • 创建一个拦截器


自定义一个类继承 HttpServletRequestWrapper

HttpServletRequestWrapper 类可以用来做关键字过滤器,因为post提交的请求是以流的形式存放,所以获取也需要以流方式获取,但是如果在拦截器中直接获取,那么在controller中将无法在获取第二次,因为流的指针无法回到最初的位置。所以使用此类就可以解决此类问题。原理是将内容以流的形式获取后,在将内容以流的形式存放进request请求中。

import com.jgmes.base.utils.JgmesFilterSpecialCharUtil;
import org.apache.commons.lang.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.Charset;
import java.util.List;/*** @author Zh* @version v1.0* @description:* @date 2020/8/6 19:07*/
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {private final byte[] body;public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {super(request);String sessStr = getBody(request);this.body = sessStr.getBytes(Charset.forName("UTF-8"));}/*** 获取body* @param request* @return* @throws IOException*/public String getBody(HttpServletRequest request) throws IOException {StringBuffer stringBuffer = new StringBuffer();InputStream inputStream = request.getInputStream();BufferedReader reader = null;String line = "";while ((line = reader.readLine()) != null){stringBuffer.append(line);}try{reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));}catch (Exception e){throw e;}finally {reader.close();}String param = stringBuffer.toString();filterIllegal(param);return param;}/*** 过滤特殊字符 自定义方法* @param param*/public void filterIllegal(String param){List<String> illegalStrings = JgmesFilterSpecialCharUtil.existsSpecialChar(param);if(illegalStrings != null && illegalStrings.size() > 0){String illegalString = StringUtils.join(illegalStrings.toArray(), ",");throw new RuntimeException("非法字符被拦截:"+ illegalString);}}
}

创建一个拦截器

import com.alibaba.fastjson.JSONObject;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Map;/*** @author Zh* @version v1.0* @description:* @date 2020/8/5 16:21*/
@WebFilter(filterName = "specialCharFilter", urlPatterns = {"/base-form-template-data/*", "/base-form-template/*", "/base-table/*"})
public class specialCharFilter implements Filter {private BodyReaderHttpServletRequestWrapper wrapper;/*** 初始化拦截器* @param filterConfig* @throws ServletException*/@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("初始化过滤器");}/*** 进行拦截操作* @param servletRequest* @param servletResponse* @param filterChain* @throws IOException* @throws ServletException*/@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;// 在wrapper中过滤post请求wrapper = new BodyReaderHttpServletRequestWrapper(request);// 过滤get请求filterGetSpace(request);filterChain.doFilter(wrapper, servletResponse);}/*** 过滤get请求* @param request*/public void filterGetSpace(HttpServletRequest request){Map param = request.getParameterMap();String paramStr = JSONObject.toJSONString(param);wrapper.filterIllegal(paramStr);}/*** 拦截器销毁*/@Overridepublic void destroy() {}
}

推荐阅读
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
author-avatar
gloriamm_520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有