ITKeyword,专注技术干货聚合推荐

注册 | 登录

cookie,session专题2-1:springmvc中jsonp跨域的几种解决方案

wabiaozia 分享于

2020腾讯云10周年活动,优惠非常大!(领取2860元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1040

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

推荐:ajax 跨域访问 jsonp解决方案

遇到跨域的问题,按下面的法子解决了.其实很简单,刚开始不知道有这条道,转了好多弯. 回调函数中有一点需要注意,json中需要将双引号全部换成单引号(原内容存在双引

方案一:简单的解决方案 方案一原文出自:http://www.cnblogs.com/iqian/p/5062760.html 解决方案技术构架:Ajax+Spring MVC实现跨域请求(JSONP)JSONP 跨域 JSONP原理及实现 接下来,来实际模拟一个跨域请求的解决方案。后端为Spring MVC架构的,前端则通过Ajax进行跨域访问。 1、首先客户端需要注册一个callback(服务端通过该callback(jsonp)可以得到js函数名(jsonpCallback)),然后以JavaScript语法的方式,生成一个function 2、接下来,将JSON数据直接以入参的方式,放置到function中,这样就生成了一段js语法文档,返回给客户端。 3、最后客户端浏览器动态的解析script标签,并执行返回的JavaScript语法文档片段,此时数据作为参数传入到了预先定义好的回调函数里(动态执行回调函数)。这种动态解析js文档和eval函数是类似的。 AJAX端: <!DOCTYPE html> <html> <head> <meta charset="utf-8">

<script src="http://code.jquery.com/jquery-2.1.3.min.js"></script> <script> $(document).ready(function(){

$("#but1").click(function(){

$.ajax({

url:'http://127.0.0.1:8080/DevInfoWeb/get',

type: "get",

async: false,

dataType: "jsonp",

jsonp: "callbackparam", //服务端用于接收callback调用的function名的参数

jsonpCallback: "success_jsonpCallback", //callback的function名称,服务端会把名称和data一起传递回来

success: function(json) {

alert(json);

},

error: function(){alert('Error');} }); });

$("#but2").click(function(){

$.ajax({

url:'http://127.0.0.1:8080/DevInfoWeb/getJsonp',

type: "get",

async: false,

dataType: "jsonp",

jsonp: "callbackparam", //服务端用于接收callback调用的function名的参数

jsonpCallback: "success_jsonpCallback", //callback的function名称,服务端会把名称和data一起传递回来

success: function(json) {

alert(json);

},

error: function(){alert('Error');} }); });

}); </script> </head> <body>

<div id="div1"><h2>使用 jQuery AJAX 来改变文本</h2></div> <button id="but1">按钮1</button> <br/> <button id="but2">按钮2</button>

</body> </html> SpringMVC端: @RequestMapping("/get")

public void get(HttpServletRequest r

推荐:数据访问的跨域解决方案:Jsonp

跟iframe脚本跨域调用中所面临的问题一样——js脚本不能跨域直接调用iframe(其它域)的脚本,在浏览器中数据的访问也存在跨域的限制:只要是跨域了

eq,HttpServletResponse res) {

res.setContentType("text/plain");

String callbackFunName =req.getParameter("callbackparam");//得到js函数名称

try {

res.getWriter().write(callbackFunName + "([ { name:\"John\"}])"); //返回jsonp数据

} catch (IOException e) {

e.printStackTrace();

}

}

@RequestMapping("/getJsonp")

@ResponseBody

public JSONPObject getJsonp(String callbackparam){ Company company=new Company(); company.setAddress("广州天河华景软件园"); company.setEmail("123456@qq.com"); company.setName("广州讯动网络可以有限公司"); company .setPhone("12345678912");

return new JSONPObject(callbackparam, company);

} 方案二:企业常用的解决方案 使用的jQuery已经提供了解决跨域访问的方案。前端:你只需要在原来的访问地址上加上?callback=?即可。后端:假如前端callback=aaa,springmvc返回时只要用aaa包裹数据即可:aaa("后台返回数据")。 怎样让返回的数据被回调函数名aaa包裹有两种办法可工参考。第一种:自己在返回数据时手动拼接,例如方案一就是手动拼接。第一种手动拼接每次拼接都是固定的拼接步骤,我们要做很多重复而又没有意义的劳动,也使得写出的代码不够简洁。假如写好的代码出现了跨域问题,我们还要重新修改代码逻辑,让程序员修改写好的而又没有错误代码,这无疑是一种折磨。第二种:通过自定义转换器的方式。自己定义一个转换器继承默认的转换器,例如在使用@ResponseBody注解的场景跨域时,可以重写MappingJackson2HttpMessageConverter类,在重写的方法里加上一段逻辑:在请求中判断是否有callback参数名,如果没有直接返回。如果有callback参数名,先拼接好callback回调函数名,再返回。然后再在注解驱动中加上自定义的转换器即可。 关于注解驱动的一些知识可以看个入门介绍:可以看spring的3.2.17版本官方文档17.15.1也可以看

http://blog.csdn.net/yfisaboy/article/details/31755631

我自己的项目本身使用的Spring MVC 3.2,实际上在3.1之后,

<mvc:annotation-driven />注册的类发生了变化 如果想了解多点可以去看看张开涛的博客:http://www.iteye.com/blogs/subjects/kaitao-springmvc 配置SpringMVC返回JSON遇到的坑:http://www.open-open.com/lib/view/open1423128254779.html 我博客所有文章目录:http://blog.csdn.net/wabiaozia?viewmode=contents ------------------------------------------------------------------------------------------------------------------- 当然最准确的定义还是官方文档,学习更多springmvc知识可以参考spring Framework的web部分. 另附spring官方文档https://spring.io/docs/reference

推荐:JSONP 跨域解决方案

JSONP跨域解决方案      一,来源:      最近学习跨域,跨域有好几种方式,jsonp,cors,通过 HTML直接链接等等,      今天对JSONP进行了实践,现在做一个小结,jsonp

方案一:简单的解决方案 方案一原文出自:http://www.cnblogs.com/iqian/p/5062760.html 解决方案技术构架:Ajax+Spring MVC实现跨域请求(JSONP)JSONP 跨域 JSONP原理及实现 接下来,来实际模拟一

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。