【Spring】@RequestParamの落し穴:POST処理なのに、URLにもパラメータがある際のパラメータの受け取り方

java

 一般的に、POSTする際、サーバへのデータ送信はリクエストボディを使用します。しかし、たまにPOSTなのに、URLの後ろにパラメータをついていることがあります。あれ?!と思うかもしれないが、確かに問題なく動きます。

 POSTのリクエストボディと、URLの後ろに同じ名前のパラメータがあるとき、@RequestParamを使用してパラメータを受け取るには注意しないといけないです。

画面側:html
……
<form id="testForm" th:action="@{/test}" th:object="${testForm}" method="post">
    <input type="hidden" name="paramA" th:value="postRequestBody">
……
    <button type="button" id="testBtn" >POST処理</button>
</form>
……
画面側:javascript
$(function() {
    // 「POST処理」ボタン押下時処理
    $(document).on("click", "button[id='testBtn']", function() {
        var form = $('#testForm');
        let actionPath = form.attr('action')
        form.attr('action' , actionPath + '?paramA=urlParam');
        $('#lapssLinkForm').submit();
        return false;
    });
}
サーバ側:java
……
@RequestMapping(value = "test")
public ModelAndView testPost(@RequestParam String paramA) {
……
}

 上記を実行して、「POST処理」ボタンを押すと、「…/test?paramA=urlParam」にアクセスするになりますが、ここで受け取ったparamAの中身を確認すると、「”urlParam,postRequestBody“」となります。つまり、POSTのリクエストボディにあるparamAの値とURLの後ろについているparamAの値両方が入っています。

 URLの後ろについているparamAの値だけ「”urlParam”」が入ると思いましたが、ここまで理解するまで色々調査して、苦労しました。

 

コメント

タイトルとURLをコピーしました