解決Ajax請求后台Servlet接口拿不到JSON數據問題


前端Ajax請求代碼如下:

window.onload=function()
{

var url='http://127.0.0.1:8080/testpj/ErrorlogServlet';

$.ajax({ 
type : "GET", 
url : url, 
async: false,
dataType: "jsonp",
jsonp: "callback",
beforeSend: function() {}, 
success : function(data) {
alert('ok');
}, 
error : function() { 
alert('false');
}
}); 

}

后台Servlet接口如下: 

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json");
        JSONObject jsonObject = new JSONObject();        
        String callback = request.getParameter("callback");
        String jsondata = "{\"logPath\":\"1\",\"success\":true}";
        String res = callback + "(" + jsondata + ")";        
        PrintWriter out = null;
        try {
            out = response.getWriter();
            out.write(res);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                out.close();
            }
        }
    }

 

先說JSON與JSONP:JSON(JavaScript Object Notation)是一種數據交換格式,而JSONP(JSON with Padding)是一個可以解決瀏覽器跨域問題的協議。

再說JSONP原理:由於瀏覽器同源策略,Ajax直接請求其他服務接口會存在跨域問題,但我們又會發現web頁面調用js文件時則不受跨域問題影響(比如<script>、<img>、<iframe>),如果想通過web跨域訪問數據就只能在服務端把數據裝進js格式的文件里,供客戶端調用。於是,JSONP協議出現了,該協議允許用戶傳遞一個callback參數給服務端,然后服務端返回數據時會將這個callback參數作為函數名來包裹住JSON數據,這樣客戶端就可以隨意定制自己的函數來自動處理返回數據了。

最后談談Ajax與JSONP:上面客戶端獲取遠程數據的方式看起來非常像Ajax,但其實並不一樣,Ajax(Asynchronous Javascript and XML)核心是 JavaScript 對象XMLHttpRequest,通過這個對象,Javascript向服務器提出請求並處理響應而不阻塞用戶。而JSONP的核心是動態添加<script>標簽來調用服務器提供的js腳本。

本例中,前端代碼因為使用到了JSONP,后台Servlet接口開始並沒有加上callback參數,所以才出現前端Ajax請求拿不到JSON數據情況出現。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM