java后台接口兼容jsonp格式数据


1、什么是JSONP

一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。
        
JSONP是一种协议,为了解决客户端请求服务器跨域的问题,但是并非是正式的传输协议。该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
我们使用JSONP也是为了解决接口的跨域问题,因为我们的接口可能会被别的合作方调用,但是让项目支持跨域请求是不安全的,因此我们要支持jsonp请求来让别人能够调用到我们的接口。若出现跨域的情况,我们的接口会报如下错误:No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 500.

2、解决方式

ajax请求代码
$(function(){
        $("#btn").click(function(){
            $.ajax({
                url : "http://192.168.0.199/dsp/j/content?channel=ysjssh",
                type : "GET",
				contentType: 'application/json; charset=utf-8',
				jsonpCallback:"success_jsonpCallback",
                dataType : "jsonp", // 返回的数据类型,设置为JSONP方式
                jsonp : "callback", //指定一个查询参数名称来覆盖默认的 jsonp 回调参数名 callback
                success: function(callback){
                    alert(callback);
                }
            });
        });
    });
	function callback(data) { 
		alert(data) 
	} 
后台请求代码

        @RequestMapping(value = "/j/xxx", produces = "text/script;charset=UTF-8")
	@ResponseBody
	public String getxxx(HttpServletRequest request, HttpServletResponse response, String callback,) {
            Map<String, Object> resultMap = new HashMap<>();
            JSONObject object = new JSONObject(resultMap);
            return callback + "(" + object.toString() + ")";
}
划重点!!注意RequestMapping的注解内容,加入produces


上一篇:云栖社区专家系列课——Java必修课第三讲


下一篇:iOS抓取HTML ,CSS XPath解析数据