新版小站的留言板中新加了一個頂樓的功能,不知道你用過了沒?
一開始,自己測試的時候貌似沒出現現在這個問題,具體問題下文分析,這裡先牢騷下。
今晚,閑著無聊,又惦記起前幾日發現的那個留言板IP轉物理地址無效的問題,故開啟網網站了點。 不料就點出了這個問題了:
點了頂之後,頁面木有任何反應,重新整理頁面後那個頂的操作確實是執行成功了。
初步分析,這個肯定是ajax返回,js木有進行正常的互動導致的。
開啟了chrome跟了下,發現ajax返回是成功的,只是傳回值怪怪的,如下
HTTP_RAW_POST_DATA = SUCCESS
理論上,執行成功需要返回 SUCCESS,這怎麼給返回了個 HTTP_RAW_POST_DATA = SUCCESS?不解。調整php頁面的返回方法都無濟於事,果斷又把問題歸結到js。
查看了,其它類似的js請求,發現傳回值都是正常的 SUCCESS ,只有我們的頂樓兄出現這個異常。
一開始跑去google HTTP_RAW_POST_DATA 是啥東東?大概瞭解了下,基本上就是php對非標準(針對php自己)的post資料格式,可以從 HTTP_RAW_POST_DATA 這裡取值,具體的自己去google吧。
有點兒頭緒了,估計是請求上出問題,之下是未修改前的程式碼片段:
代碼如下 |
複製代碼 |
$.ajax({ type: "post", url: "index.php?m=request&do=upMessage&id=" + id + "&rdn="+Math.random(), dataType: "text", success: function (d) { switch($.trim(d)) { case "ERROR": alert("怎奈人品實在不行,出錯了..."); break; case "SUCCESS": $("#up_num_"+id).html(parseInt($("#up_num_"+id).html())+1); o.setAttribute("onclick", "javascript:void(0);"); o.style.color = "#666"; break; default: break; } }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(errorThrown); } }); |
有木有看出什麼門道?
其實,一開始我也沒看出啥東東來呢,慚愧。。。
代碼如下 |
複製代碼 |
type: "post", url: "index.php?m=request&do=upMessage&id="+ id +"&rdn="+Math.random(), 拆分成
type: "post", url: "index.php?m=request&do=upMessage&rdn="+Math.random(), data: "id="+ id, OR
type: "get", url: "index.php?m=request&do=upMessage&id="+ id +"&rdn="+Math.random(), |
這樣就可以了,原因
其實就是使用jquery中的ajax方法去進行請求,如果使用的要求方法是post那麼你必須得post一個非空的data參數,否則就會報上面的那個錯誤!因為,所有post的資料都沒有那麼應該就胡亂post資料了,我這是胡亂說的,大概這個意思吧,深層原因自己google吧,我這就點到這了,但接著我如果使用中文又碰到問題了,中文返回為亂碼了,這裡自己不拿上成改了直接找到一個解決方案整理給大家。
ajax傳回值為中文時亂碼
代碼如下 |
複製代碼 |
伺服器端代碼: /** * 非同步(返回json資料格式)(支援分頁) * @param mapping * @param form * @param request * @param response * @return * @throws AppException */ public ActionForward queryErrorCodeRecordByPage(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { Integer currentpage = Integer.parseInt(request.getParameter("currentpage")) ; Integer pagesize = Integer.parseInt(request.getParameter("pagesize")) ; try { List ListByPage = this.errorCodeRecordFacade.queryErrorCodeRecordByPage(currentpage, pagesize); JSONArray json = JSONArray.fromObject(ListByPage); System.out.println("JSONArray資料---" + json.toString() ); request.setCharacterEncoding("utf-8"); //這裡不設定編碼會有亂碼 response.setContentType("text/html;charset=utf-8"); response.setHeader("Cache-Control", "no-cache"); PrintWriter out = response.getWriter(); //輸出中文,這一句一定要放到response.setContentType("text/html;charset=utf-8"), response.setHeader("Cache-Control", "no-cache")後面,否則中文返回到頁面是亂碼 out.print(json.toString()); out.flush(); out.close(); } catch (Exception e) { log.error("查詢資料出錯", e); } return null ; } |
用戶端的代碼:
代碼如下 |
複製代碼 |
//非同步 根據分頁來取錯誤碼曆史 資料 function search_errorCodeRecord(currentpage,pagesize) { $.ajax({ async :true, url: "<%=request.getContextPath()%>/errorCodeRecord/queryErrorCodeRecordByPage.do", type: "post", data: { currentpage: currentpage, pagesize:pagesize}, // dataType : "json", //這裡已經定義資料格式 contentType: "application/x-www-form-urlencoded; charset=utf-8", success:function(data) { alert(data); // var json=eval('('+data+')'); // jquery調用時會檢測到,從而直接把返回格式當做json處理,所以再轉化會報錯。 var json=eval(data); resolv_json(json) ; } }); } //解析json數組,動態拼接到白色Div中 function resolv_json(json) { for(var i=0;i<json.length;i++) { // alert(json[i].boss_resultinfo); var operate_state = "新增了" ; if(json[i].operate_state == "2" ) { operate_state= "修改了" ; } if(json[i].operate_state == "3" ) { operate_state= "刪除了" ; } var p=$("<p></p>"); var span1=$("<span></span>"); var span2=$("<span></span>"); var span3=$("<span></span>"); var span4=$("<span></span>"); var times = json[i].operate_time.time; // alert(json[i].operate_time.time); //時間格式是個JSON對象 // alert(getLocalTime(times)); span1.html(getLocalTime(times)); span2.html(json[i].operate_people); span3.html(operate_state); span4.html(json[i].businessname +" 錯誤碼"); p.append(span1).append(span2).append(span3).append(span4); $("#whiteDiv").append(p); } } //時間戳記轉化為時間 function getLocalTime(nS) { return new Date(parseInt(nS)).toLocaleString().replace(/:d{1,2}$/,' '); } <div id="whiteDiv">
</div> |
總結如下:
1. PrintWriter out = response.getWriter(); 一定要放在
request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8");
編碼的後面(原因很簡單,你懂的。)
2. jquery 加不加 content-type的參數 都不影響。
contentType: "application/x-www-form-urlencoded; charset=utf-8",