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

servlet如何获取PUT和DELETE请求的参数

1. servlet为何不能获取PUT和DELETE请求的参数

Servlet的规范是POST的数据需要转给request.getParameter*()方法,没有规定PUT和DELETE请求也这么做

The Servlet spec requires form data to be available for HTTP POST but not for HTTP PUT or PATCH requests. This filter intercepts HTTP PUT and PATCH requests where content type is 'application/x-www-form-urlencoded', reads form encoded content from the body of the request, and wraps the ServletRequest in order to make the form data available as request parameters just like it is for HTTP POST requests.

2. 解决方案

        2-1  前端使用ajax请求时,发送json类型的参数

        2-2  后端使用字符流读取前端传递的参数

3. 具体的实现

        3-1 前端部分

$(function () {// 1. 请求参数let params = {id: 51,phone: '17911113333',userCode: 'barrss',userName: 'barrss',address: '不详',userRole: 1,gender: 1,birthday: '1998-10-12',}// 2. 使用jQuery的$.ajax()发送put类型请求进行用户修改$.ajax({url: 'http://localhost/day81/updateUser',// 请求类型是puttype: 'put',dataType: 'json',// 通过请求头告诉服务端,发送的数据是json类型contentType: 'application/json',// 前端必须传递json字符串,否则后端无法解析data: JSON.stringify(params),headers: { token: '***.***zAyMjYwfQ.***' },success(res) {console.log(res)},error(e) {console.log(e)},})
})

        3-2 后端MyUtil工具类中定义方法 getJSONParams

/***  获得前端发送的json类型参数** @param req 封装客户端请求信息的对象* @return 包含请求参数的Map集合*/public static Map<String, String> getJSONParams(HttpServletRequest req) throws ServletException, IOException {// 1. 打开输入流读取客户端写入的json字符串InputStream in = req.getInputStream();// 2. 使用BufferedReader包装流,指定字符串BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));String str = null;StringBuilder builder = new StringBuilder();// 3. 读取客户端传递的json字符串参数,拼接到StringBuilder中while ((str = reader.readLine()) != null) {builder.append(str);}String params = builder.toString();// 4. 去除json字符串中的{}params = params.substring(1, params.length() - 1);// 5. 去除json字符串中的 "params = params.replace("\"", "");Map<String, String> map = new HashMap<>();// 6. 拆分字符串,把key=value键值对, 存放到map中String[] arr = params.split(",");for (String item : arr) {String[] code = item.split(":");map.put(code[0], code[1]);}return map;}

      3-3 servlet中的doPut方法中使用getJSONParams即可

  @Overrideprotected void doPut(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {Map<String, String> map = MyUtil.getJSONParams(req);req.setAttribute("params", map);doPost(req, res);}

4. 总结

        使用此种方法获取客户端的put和delete请求方法,要规定客户端必须传递json字符串,后端需要自己开发方法来进行获取,使用起来并不方便,也不灵活。可以考虑使用POST代替PUT或DELETE请求,方便获取参数,不仅安全,而且高效!不妥之处还请指正。

http://www.lryc.cn/news/179496.html

相关文章:

  • 【Vue.js】使用Element中的Mock.js搭建首页导航左侧菜单---【超高级教学】
  • 从技术创新到应用实践,百度智能云发起大模型平台应用开发挑战赛!
  • 简单三步 用GPT-4和Gamma自动生成PPT PDF
  • QT设置弹窗显示屏幕中央
  • 正点原子嵌入式linux驱动开发——STM32MP1启动详解
  • FPGA的数字钟带校时闹钟报时功能VHDL
  • 分析各种表达式求值过程
  • 企业风险管理策略终极指南
  • OpenCV之分水岭算法(watershed)
  • npm 命令
  • 【bug 记录】yolov5_C_demo 部署在 rv1126
  • [vue-admin-template实战笔记]
  • unity 限制 相机移动 区域(无需碰撞检测)
  • Hudi第二章:集成Spark
  • springboot和vue:八、vue快速入门
  • docker-compose内网本地安装
  • ThreeJs的场景实现鼠标拖动旋转控制
  • jdk 管理工具比对 jEnv jabba SDKMAN
  • 华为云云耀云服务器L实例评测|部署在线图表和流程图绘制工具drawio
  • elementui引入弹出框报错:this.$alert is not defined 解决方案
  • docker的组件和资源管理
  • SEO的优化教程(百度SEO的介绍和优化)
  • Tomcat以及UDP
  • NLP 04(GRU)
  • BUUCTF reverse wp 51 - 55
  • WebGL笔记:使用鼠标绘制多个线条应用及绘制动感线性星座
  • nodejs+vue 汽车销售系统elementui
  • leetcode76 Minimum Window Substring
  • 简单工厂模式~
  • 基于Java的会员管理系统设计与实现(源码+lw+部署文档+讲解等)