开发者社区> 问答> 正文

求救: jsonp跨域访问问题?报错

我正在做一个和腾讯开放平台对接的项目。需要使用QQ的登陆功能,而且要获取到用户的QQ头像。

现有代码如下:

var appId = '${sessionScope.openqq_appid}';
var openId = '${sessionScope.openqq_openid}';
var token = '${sessionScope.openqq_access_token}';
var get_user_info_url = "https://graph.qq.com/user/get_user_info";
var param = "oauth_consumer_key="+appId+
    "&access_token="+token
    +"&openid="+openId+"&jsoncallback=?";

$.ajax({
            					"async":false,
            					"url":get_user_info_url,
            					"type":"GET",
            					"dataType":"jsonp",
            					"jsonp":"jsoncallback",
            					"data":param,
            					"success":function(data){
            						//console.info(data);
            					}
            				});



但是问题是,当我请求的时候,可以再浏览器的控制台看到请求到的数据,但是在代码中我没法使用请求到的数据。原因是控制台还报了一个错误!

Uncaught SyntaxError: Unexpected token : get_user_info:2

在报错之前,浏览器端有警告:

Resource interpreted as Script but transferred with MIME type text/html: "https://graph.qq.com/user/get_user_info?jsoncallback=jQuery1800975545929744…openid=3BC30BD0A1B4CDA93E87F1BDEF13D0D0&jsoncallback=testA&_=1409037996793".

获取到的数据"get_user_info",如下图所示:


我想问题应该是出在腾讯的服务器对jsonp不支持造成的。但是我现在不知道该怎么通过js获取到这些我需要的数据。

求高手指点!谢谢!

展开
收起
爱吃鱼的程序员 2020-06-14 22:17:35 675 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    前台暴露你的appid?appikey? 

    jsonp貌似无解.....

    后台获取的亲!

    能使用后端获取吗?appidappkey都爆了。你可以ajax请求,后端获取数据后返回。不需要js跨域。

    问题终于解决了。直接从后端获取:

    Stringurl="https://graph.qq.com/user/get_user_info"+"?"+"oauth_consumer_key="+getAppId()+"&access_token="+accessToken+"&openid="+openID;Strings=HttpClientUtil.sendGetRequest(url,"utf-8");QQUserInfoinfo=JSON.parseObject(s,QQUserInfo.class);StringuserImg=info.getFigureurl_qq_2();



    /***发送HTTP_GET请求*@see该方法会自动关闭连接,释放资源*@paramrequestURL请求地址(含参数)*@paramdecodeCharset解码字符集,解析响应数据时用之,其为null时默认采用UTF-8解码*@return远程主机响应正文*/publicstaticStringsendGetRequest(StringreqURL,StringdecodeCharset){longresponseLength=0;//响应长度StringresponseContent=null;//响应内容HttpClienthttpClient=newDefaultHttpClient();//创建默认的httpClient实例HttpGethttpGet=newHttpGet(reqURL);//创建org.apache.http.client.methods.HttpGettry{SSLSocketFactory.getSocketFactory().setHostnameVerifier(newAllowAllHostnameVerifier());HttpResponseresponse=httpClient.execute(httpGet);//执行GET请求HttpEntityentity=response.getEntity();//获取响应实体if(null!=entity){responseLength=entity.getContentLength();responseContent=EntityUtils.toString(entity,decodeCharset==null?"UTF-8":decodeCharset);//EntityUtils.consume(entity);//Consumeresponsecontent}System.out.println("请求地址:"+httpGet.getURI());System.out.println("响应状态:"+response.getStatusLine());System.out.println("响应长度:"+responseLength);System.out.println("响应内容:"+responseContent);}catch(ClientProtocolExceptione){log.error("该异常通常是协议错误导致,比如构造HttpGet对象时传入的协议不对(将'http'写成'htp')或者服务器端返回的内容不符合HTTP协议要求等,堆栈信息如下",e);}catch(ParseExceptione){log.error(e.getMessage(),e);}catch(IOExceptione){log.error("该异常通常是网络原因引起的,如HTTP服务器未启动等,堆栈信息如下",e);}finally{httpClient.getConnectionManager().shutdown();//关闭连接,释放资源}returnresponseContent;}



    感谢各位的参与!谢谢!

    我最近也是遇到這个问题,折磨了一天最终还是不能直接跨域,基本上的api接口都没有添加jsonp,返回的js对象,所以就不能用了。

    我还想了不知道可不可以用js获取到当前页面访问过的资源,因为上面的那种ajax后有那些作为错误的js文件存在,然后把这些文件读取在作为需要的数据?可行么?

    如果可以的话,都改成get请求,就不存在post跨域问题了,我是说如果可以。否则的话,就用某种语言的http模块来做吧。
    2020-06-14 22:17:52
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载