post请求通过form表单的submit提交,url和请求体中都添加同样的参数,会怎么样?

关于POST请求参数后端出现截取现象分析

概述

如果post请求通过form表单的submit提交,url和请求体中都添加同样的参数,会怎么样?

事由

生产过程中出现参数被截断的现象,一直定位不到问题。

复盘

  • 1.测试demo
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div>
		<button onclick="doPrint()">发送</button>
	</div>
</body>
<script>
	
	function doPrint(){
    
    
		var consArray = new Array();
		for(var i=0; i< 500; i++){
    
    
			consArray.push("5025303");
		}
		consArray.push("5053041");
		var args = new Object();
		args.consNo = consArray;
		printNoSelect(args);
	}

	function printNoSelect(args, preview) {
    
    
		var params = "";
		if (args) {
    
    
			for ( var prop in args) {
    
    
				params = params + "&" + prop + "=" + args[prop];
			}
		}
		var url = "http://localhost:8088/learn-web/helloWorld/postRequest.do?U="
				+ (new Date()).getTime() + params;
		PostWindow(url, args, '打印预览');
	}

	/**
	 * 以post方式打开新页面
	 * @param url
	 * @param data
	 * @param name
	 */
	function PostWindow(url, data, name) {
    
    
		var tempForm = document.createElement("form");
		tempForm.id = "tempForm1";
		tempForm.method = "post";
		tempForm.action = url;
		tempForm.target = name;
		for ( var prop in data) {
    
    
			var hideInput = document.createElement("input");
			hideInput.type = "hidden";
			hideInput.name = prop;
			hideInput.value = data[prop];
			tempForm.appendChild(hideInput);
		}
		document.body.appendChild(tempForm);
		tempForm.submit();
		document.body.removeChild(tempForm);
	}
</script>
</html>
@RequestMapping("/testPost")
	public String testPost(Model m, HttpServletRequest req) {
    
    
		m.addAttribute("consNo", "");
		return "testPost";
	}

@RequestMapping("/postRequest")
@ResponseBody
public String postRequest(HttpServletRequest req, HttpServletResponse res) {
    
    
    Map rptParas = new HashMap();
    Map parasMap = req.getParameterMap();
    Iterator it = parasMap.entrySet().iterator();
    while (it.hasNext()) {
    
    
        Map.Entry entry = (Map.Entry) it.next();
        Object key = entry.getKey();
        Object value = entry.getValue();
        if ((key instanceof String) && (value instanceof String[])) {
    
    
            rptParas.put((String) key, ((String[]) (String[]) value)[0]);
        }
    }
    System.out.print(rptParas.get("consNo").toString().split(",").length);
    return "1";
}

在这里插入图片描述
在这里插入图片描述

  • 2.抓包分析

在这里插入图片描述
在这里插入图片描述

  • 3.源码分析

在这里插入图片描述
在这里插入图片描述

总结

业务方面

  • 1.批量传递数据,如果是批量全选的话,完全可以一个ID信息都不需要。

  • 2.如果只有少数批量信息没有被勾选,那么可以尝试传递这些没有被勾选的信息,然后去后端过滤这些ID。

  • 3.有很多种方式可以做到把参数数据量的体积减下来,通讯效率会大大提高。

测试方面

  • 1.测试的时候,清除缓存再测试。

  • 2.如果在测试过程中初步怀疑是某一原因导致,就改原因多测试几遍,测一遍肯定是不保险。

  • 3.多人测试的时候环境一定要同步,否则反馈的信息就不准确。

猜你喜欢

转载自blog.csdn.net/qq125281823/article/details/106781689
今日推荐