投稿リクエストはフォームフォームの送信を通じて送信され、同じパラメータがURLとリクエスト本文に追加されます。どうなりますか?

POSTリクエストパラメータのバックエンドでのインターセプトの現象に関する分析

概要概要

フォームフォームの送信を通じてPOSTリクエストが送信され、URLとリクエスト本文の両方に同じパラメータが追加された場合はどうなりますか?

原因

パラメータは製造プロセス中に切断され、問題を特定できませんでした。

リプレイ

  • 1.デモをテストします
<%@ 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