SpringMVC中使用Ajax POST請(qǐng)求以json格式傳遞參數(shù)服務(wù)端通過request.getParameter("name")無法獲取參數(shù)值問題分析

一:?jiǎn)栴}demo展示

在開發(fā)新需求隔嫡,調(diào)試代碼的時(shí)候發(fā)現(xiàn)一個(gè)問題管削,就是HttpServletRequest 獲取不到ajax post請(qǐng)求的json參數(shù)杂彭!下面是偽代碼是整個(gè)請(qǐng)求的邏輯岩喷!

1.前臺(tái)JS請(qǐng)求代碼(偽代碼)

    var _phoneId = "123456789";
    
    var closeUrl=contextPath+"/close";

    ajax(closeUrl,{"phoneId":_phoneId},"post",false,callbackForSessionClose,null,'json');
    
    function ajax(url,reqData,type,async,successBack,errorBack,statusText,dataType){
        
        $.ajax({
            type : type,
            url : url,
            dataType : dataType,
            async : async,
            timeout : "60000",
            contentType : "application/json",
            data : JSON.stringify(reqData),
            success : function(data) {
                // 成功的處理邏輯
             
            },
            error : function(data) {
                // 錯(cuò)誤的處理邏輯
            }
            
        });
    }

2.后臺(tái)代碼(偽代碼)

    @RequestMapping(value="/close",method=RequestMethod.POST)
    @ResponseBody
    public String closeSession(HttpServletRequest request){
        String response;
        try{
            String phoneId = request.getParameter("phoneId");
            if(phoneId == "123456789"){
                response = "success";
            }else{
                response = "error";
            }
        }catch (ServiceException e) {
            //業(yè)務(wù)異常處理邏輯
        }catch (Exception e) {
            //非業(yè)務(wù)異常處理邏輯
        
        }
        return response;
    }

二:?jiǎn)栴}分析

正常的post請(qǐng)求(不包括ajax請(qǐng)求)在http頭中的content-type為application/x-www-form-urlencoded,這時(shí)在java后臺(tái)可以通過request.getParameter(name)的形式獲取.但是通過原生ajax請(qǐng)求時(shí),在java后臺(tái)通過request.getParameter(name)的形式卻無法獲取到傳入的參數(shù).

原因是原生ajax請(qǐng)求時(shí),在http頭中的content-type為text/plain;charset=UTF-8.當(dāng)請(qǐng)求到達(dá)tomcat服務(wù)器時(shí),服務(wù)器只對(duì)application/x-www-form-urlencoded形式的http,post請(qǐng)求進(jìn)行讀取body體中的參數(shù),并放到request的parameter中,對(duì)于原生ajax請(qǐng)求則直接忽略,不會(huì)讀取body體中的參數(shù),才導(dǎo)致request.getParameter(name)讀取不到參數(shù).

根據(jù)上面的分析結(jié)合自己的當(dāng)前系統(tǒng)视事,發(fā)現(xiàn)系統(tǒng)封裝的ajax默認(rèn)content-type為application/json,那么這種方式在java后臺(tái)通過request.getParameter(name)的形式是不能獲取到傳入的參數(shù)的礼旅!

三:解決方案

1.[前臺(tái)解決方案]修改Ajax post請(qǐng)求的contentType和data

修改前:

        contentType : "application/json",
        data : JSON.stringify(reqData),
        

修改后:

        contentType : "application/x-www-form-urlencoded",
        data : reqData, //不需要使用JSON.stringify()

后臺(tái)代碼不變膳叨!

2.[后臺(tái)解決方案]使用@RequestBody

前臺(tái)js代碼不變!

后臺(tái)代碼修改:

新增一個(gè)類:

    public class CloseRequestVO implements Serializable{
        
        private String phoneId;
        //省略get set方法
        //....
        
    }
    @RequestMapping(value="/close",method=RequestMethod.POST)
    @ResponseBody
    public String closeSession(@RequestBody CloseRequestVO requestVO){
        String response;
        try{
            String phoneId = requestVO.getPhoneId();
            if(phoneId == "123456789"){
                response = "success";
            }else{
                response = "error";
            }
        }catch (ServiceException e) {
            //業(yè)務(wù)異常處理邏輯
        }catch (Exception e) {
            //非業(yè)務(wù)異常處理邏輯
        
        }
        return response;
    }

后臺(tái)通過request.getParameter(name)方式就可以獲取到參數(shù).

上面兩種方式選擇適合自己系統(tǒng)的方案即可痘系!

四:@RequestBody簡(jiǎn)單介紹

@RequestBody : @RequestBody是指方法參數(shù)應(yīng)該被綁定到HTTP請(qǐng)求Body上

<font color='red'>申明:在SpringMVC環(huán)境中,@RequestBody接收的是一個(gè)Json對(duì)象的字符串菲嘴,而不是一個(gè)Json對(duì)象。</font>
所以
第一:@RequestBody需要接的參數(shù)是一個(gè)String化的json汰翠,前臺(tái)js代碼可以直接使用JSON.stringify(json)這個(gè)方法來轉(zhuǎn)化龄坪;

第二:從@RequestBody名稱上來看,也就是說要讀取的數(shù)據(jù)在請(qǐng)求體(body)里复唤,所以要發(fā)post請(qǐng)求健田;

第三:@RequestBody接收的是一個(gè)String的Json,那么要設(shè)置請(qǐng)求contentType佛纫,contentType:"application/json妓局,明確的告訴服務(wù)器發(fā)送的內(nèi)容是json。

五:參考資料

jquery通過ajax-json訪問java后臺(tái)傳遞參數(shù),通過request.getParameter獲取不到參數(shù)的說明

@RequestBody應(yīng)用


如果帥氣(美麗)雳旅、睿智(聰穎)跟磨,和我一樣簡(jiǎn)單善良的你看到本篇博文中存在問題间聊,請(qǐng)指出攒盈,我虛心接受你讓我成長(zhǎng)的批評(píng),謝謝閱讀哎榴!
祝你今天開心愉快型豁!


歡迎訪問我的csdn博客,我們一同成長(zhǎng)尚蝌!

不管做什么迎变,只要堅(jiān)持下去就會(huì)看到不一樣!在路上飘言,不卑不亢!

博客首頁http://blog.csdn.net/u010648555

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衣形,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谆吴,老刑警劉巖倒源,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異句狼,居然都是意外死亡笋熬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門腻菇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胳螟,“玉大人,你說我怎么就攤上這事筹吐√撬剩” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵丘薛,是天一觀的道長(zhǎng)蔬捷。 經(jīng)常有香客問我,道長(zhǎng)榔袋,這世上最難降的妖魔是什么周拐? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮凰兑,結(jié)果婚禮上妥粟,老公的妹妹穿的比我還像新娘。我一直安慰自己吏够,他們只是感情好勾给,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锅知,像睡著了一般播急。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上售睹,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天桩警,我揣著相機(jī)與錄音,去河邊找鬼昌妹。 笑死捶枢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的飞崖。 我是一名探鬼主播烂叔,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼固歪!你這毒婦竟也來了蒜鸡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逢防,沒想到半個(gè)月后康聂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胞四,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年恬汁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辜伟。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氓侧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出导狡,到底是詐尸還是另有隱情约巷,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布旱捧,位于F島的核電站独郎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏枚赡。R本人自食惡果不足惜氓癌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贫橙。 院中可真熱鬧贪婉,春花似錦、人聲如沸卢肃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莫湘。三九已至尤蒿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間幅垮,已是汗流浹背腰池。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留军洼,地道東北人巩螃。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像匕争,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子爷耀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容