spring JSONP

1. Jsonp原理介绍

Ajax想必已经是家喻户晓,但是,受制于浏览器的“同源策略”,当需要进行跨越访问时,Ajax就显得有些无能为力。这个时候,我们便需要Jsonp,Jsonp是Json with padding的简称,它是一个非官方协议,允许在服务端继承script tags返回至客户端,通过javascript callback的形式实现跨越访问。

说得更明确一点,就是前端通过JS创建一个script标签,并将src指向请求的url,同时在url中指定回调的callback,而Server端将请求数据转换为json格式(jsonData),将数据填充到callback中并回调callback。

 

2. 在Spring中支持Jsonp请求

当然了,如果在实际项目中,要考虑方方面面的小细节的处理,但是,作为示例,这里只实现上述的核心流程。借助于之前的一篇文章“Spring MVC自定义视图的实现”,要支持Jsonp的请求,我们只需新增对于JSONP视图的支持,在Jsonp视图的渲染函数中,将需返回的数据转换为json格式,并回调callback即可,当然了callback函数的名称需要前端传入,在Jsonp视图中从request中获得。

JSONP视图的实现如:

 
 
  1. public class JsonpView extends AbstractView {
  2.  
  3. protected void renderMergedOutputModel(Map<String, Object> model,
  4. HttpServletRequest request, HttpServletResponse response) throws Exception {
  5. //将model中的数据转换为JSON格式
  6. JSONObject json = (JSONObject)JSONSerializer.toJSON(model);
  7. //得到JSONP的callback函数名称
  8. String callback = request.getParameter("callback");
  9. //将数据填充到callback,并回调
  10. StringBuffer buf = new StringBuffer();
  11. buf.append(callback);
  12. buf.append("(");
  13. buf.append(json.toString());
  14. buf.append(");");
  15. response.setContentType("text/plain; charset=GBK");
  16. response.getOutputStream().write(buf.toString().getBytes());
  17. response.getOutputStream().flush();
  18. }
  19. }

前端的实现如:

 
 
  1. vote = function(){
  2. var url = "log/vote.jsonp?callback=" +"voteCallback";
  3. var script = document.createElement("script");
  4. script.setAttribute("src",url);
  5. script.setAttribute("type","text/javascript");
  6. document.getElementsByTagName("head")[0].appendChild(script);
  7. };
  8. voteCallback = function(data){
  9. alert(data.username+data.password);
  10. }

 

当触发vote()函数时,在head中创建一个<script>标签,并将src之前Server端请求url,通知在url中指明callback函数名称,以便服务端可以回调callback函数,同时前端还需实现callback函数,对服务端填充的json数据进行处理,上面示例中只是简单的alert。

而Server端的controller如:

 
 
  1. public String vote(ModelMap model){
  2. model.addAttribute("username","ds");
  3. model.addAttribute("password","123456");
  4. return "vote.jsonp";
  5. }

最后,spring mvc配置文件如:

 
 
  1. <bean id="multiViewResolver" class="cn.ds.core.service.spring.JmatrixMultiViewResolver">
  2. <property name="viewMap">
  3. <map>
  4. <entry key=".config" value-ref="configView" />
  5. <entry key=".jsonp" value-ref="jsonpView" />
  6. </map>
  7. </property>
  8. </bean>
  9. <bean id="jsonpView" class="cn.ds.core.service.spring.JsonpView"></bean>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值