• 如何解决ajax跨域问题


    找到一种解决方式
    现在也知道了怎样来解决跨域问题,余下的就是实现的细节了。

    实现的过程中错误还是避免不了的。

    由于不了解json和jsonp两种格式的区别,也犯了错误,google了好久才解决。


    首先来看看在页面中如何使用jQuery的ajax解决跨域问题的简单版:

    $(document).ready(function(){
    varurl="localhost:8080/workgroupmanagment/open/getgroupbyid"
    +"?id=1&callback=?";
    $.ajax({
    url:url,
    datatype:"jsonp",
    processdata:false,
    type:"get",
    success:function(data){
    alert(data.name);
    },
    error:function(XmLhttpRequest,textstatus,errorthrown){
    alert(XmLhttpRequest.status);
    alert(XmLhttpRequest.readystate);
    alert(textstatus);
    }});
    });

    这样写是完全没有问题的,起先error的处理函数中仅仅是alert(“error”),为了进一步弄清楚是什么原因造成了错误,故将处理函数变为上面的实现方式。

    最后一行alert使用为;parsererror。

    百思不得其解,继续google,最终还是在万能的stackoverflow找到了答案,链接在这里。

    原因是jsonp的格式与json格式有着细微的差别,所以在server端的代码上稍稍有所不同。


    比较一下json与jsonp格式的区别:
    json格式:
    {
    "message":"获取成功",
    "state":"1",
    "result":{"name":"工作组1","id":1,"description":"11"}
    }

    jsonp格式:
    callback({
    "message":"获取成功",
    "state":"1",
    "result":{"name":"工作组1","id":1,"description":"11"}
    })

    看出来区别了吧,在url中callback传到后台的参数是神马callback就是神马,jsonp比json外面有多了一层,callback()。

    这样就知道怎么处理它了。

    于是修改后台代码。


    后台java代码最终如下:

    @Requestmapping(value="/getgroupbyid")
    publicstringgetgroupbyid(@RequestParam("id")Longid,
    httpservletRequestrequest,httpservletResponseresponse)
    throwsioexception{
    stringcallback=request.getParameter("callback");
    Returnobjectresult=null;
    groupgroup=null;
    try{
    group=groupservice.getgroupbyid(id);
    result=newReturnobject(group,"获取成功",constants.ResuLt_success);
    }catch(businessexceptione){
    e.printstacktrace();
    result=newReturnobject(group,"获取失败",constants.ResuLt_FaiLed);
    }
    stringjson=Jsonconverter.bean2Json(result);
    response.setcontenttype("text/html");
    response.setcharacterencoding("utf-8");
    Printwriterout=response.getwriter();
    out.print(callback+"("+json+")");
    returnnull;
    }

    注意这里需要先将查询结果转换我json格式,然后用参数callback在json外面再套一层,就变成了jsonp。

    指定数据类型为jsonp的ajax就可以做进一步处理了。


    虽然这样解决了跨域问题,还是回顾下造成parsererror的原因。

    原因在于盲目的把json格式的数据当做jsonp格式的数据让ajax处理,造成了这个错误,此时server端代码是这样的:

    @Requestmapping(value="/getgroupbyid")
    @Responsebody
    publicReturnobjectgetgroupbyid(@RequestParam("id")Longid,
    httpservletRequestrequest,httpservletResponseresponse){
    stringcallback=request.getParameter("callback");
    Returnobjectresult=null;
    groupgroup=null;
    try{
    group=groupservice.getgroupbyid(id);
    result=newReturnobject(group,"获取成功",constants.ResuLt_success);
    }catch(businessexceptione){
    e.printstacktrace();
    result=newReturnobject(group,"获取失败",constants.ResuLt_FaiLed);
    }
    returnresult;
    }

    至此解决ajax跨域问题的第一种方式就告一段落。


    追加一种解决方式
    追求永无止境,在google的过程中,无意中发现了一个专门用来解决跨域问题的jQuery插件-jquery-jsonp。


    有第一种方式的基础,使用jsonp插件也就比较简单了,server端代码无需任何改动。


    来看一下如何使用jquery-jsonp插件解决跨域问题吧。



    varurl="localhost:8080/workgroupmanagment/open/getgroupbyid"
    +"?id=1&callback=?";
    $.jsonp({
    "url":url,
    "success":function(data){
    $("#current-group").text("当前工作组:"+data.result.name);
    },
    "error":function(d,msg){
    alert("couldnotfinduser"+msg);
    }
    });

    至此两种解决跨域问题的方式就全部介绍完毕。

    原文地址:https://www.weidianyuedu.com/content/3220473944405.html

  • 相关阅读:
    【Final Project】Kitti的双目视觉里程计(2)重读
    AI系统ChatGPT源码+详细搭建部署教程+AI绘画系统+支持GPT4.0+Midjourney绘画+已支持OpenAI GPT全模型+国内AI全模型
    linux部署运维3——centos7.9离线安装部署配置涛思taos2.6时序数据库TDengine以及java项目链接问题处理(二)
    改进 hibernate-validator,新一代校验框架 validator 使用介绍 v0.4
    WebSocket
    Python 机器学习入门之ID3决策树算法
    Asp.Net Core Identity 多数据库支持
    基于元数据的数据治理分析功能说明
    03. C语言编写LED
    Normalizer(归一化)和MinMaxScaler(最小-最大标准化)的区别详解
  • 原文地址:https://blog.csdn.net/weixin_45707610/article/details/126582061