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.複数の人でテストする場合は、環境を同期する必要があります。そうしないと、フィードバック情報が不正確になります。