【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="<strong><span class="bold-green">paramA</span></strong>" th:value="<span class="bold-blue">postRequestBody</span>">
……
    <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 + '?<strong><span class="bold-green">paramA</span></strong>=<span class="bold-blue">urlParam</span>');
        $('#lapssLinkForm').submit();
        return false;
    });
}
サーバ側:java
……
@RequestMapping(value = "test")
public ModelAndView testPost(@RequestParam String <strong><span class="bold-green">paramA</span></strong>) {
……
}

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

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

 

コメント

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