jsonp跨域请求详解


Posted in Javascript onJuly 13, 2017

前端时间因为太忙,一直没有处理跨域这个事情,今天抽了一个小时轻松解决,突然发现上个月又写了很多重复代码。因为现在公司项目分为多个工程,前后端完全分离,manage工程做所有业务逻辑处理,app、微信两个前置工程通过httpClient去调用manage工程的restful接口,而我就是负责微信这个工程,久而久之发现真的重复了很多controller层的代码,愈发激活了这个所有接口支持浏览器跨域请求的封装。话不多讲,见核心代码

1.定义一个类,继承MappingJackson2HttpMessageConverter,重写writeInternal方法,方法里简单判断一下是否带有callback参数,没有直接返回数据,有的话将数据用callback参数的值括号包裹起来返回。

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonProcessingException;

public class CallbackMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {

 // 做jsonp的支持的标识,在请求参数中加该参数
 private String callbackName;

 @Override
 protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException,
   HttpMessageNotWritableException {
  // 从threadLocal中获取当前的Request对象
  HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
    .currentRequestAttributes()).getRequest();
  String callbackParam = request.getParameter(callbackName);
  if (StringUtils.isEmpty(callbackParam)) {
   // 没有找到callback参数,直接返回json数据
   super.writeInternal(object, outputMessage);
  } else {
   JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
   try {
    String result = callbackParam + "(" + super.getObjectMapper().writeValueAsString(object)
      + ");";
    IOUtils.write(result, outputMessage.getBody(), encoding.getJavaName());
   } catch (JsonProcessingException ex) {
    throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
   }
  }

 }

 public String getCallbackName() {
  return callbackName;
 }

 public void setCallbackName(String callbackName) {
  this.callbackName = callbackName;
 }

}

2.定义Java bean,注意修改class扫描路径,这样每次请求过来都会调起MappingJackson2HttpMessageConverter类里的riteInternal这个方法,如果请求带上了callback参数,则将以callbackValue('data')格式的数据返回给前端。

<!-- 定义注解驱动 -->
 <mvc:annotation-driven>
  <mvc:message-converters register-defaults="true">
   <bean
    class="xxx.xxx.xxx.CallbackMappingJackson2HttpMessageConverter">
    <property name="callbackName" value="callback" />
   </bean>
  </mvc:message-converters>
 </mvc:annotation-driven>

3.前端通过jquery封装的ajax方式调用,这里做了一些代码节省,关键代码已红色标出

<script type="text/javascript">
 var feedback = {
  init: function(){
   var self = feedback;
   self.bind();
  },
  test: function(data){
   console.log("测试jsonp",data)
  },
  bind: function(){
    var self = feedback;

    var par = {};
     par.callback = 'feedback.test';

    $.ajax({ 
    url:"http://manage.danong.com/rest/open/queryInviteList", 
    data: par,
    dataType:'jsonp', 
    jsonp:'callback', 
    timeout:3000 
   }); 
  }
 }
 feedback.init();
</script>

4.浏览器打印log

 jsonp跨域请求详解

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JAVASCRIPT IE 与 FF中兼容问题小结
Feb 18 Javascript
jquery text,radio,checkbox,select操作实现代码
Jul 09 Javascript
基于jquery的商品展示放大镜
Aug 07 Javascript
ExtJS DOM元素操作经验分享
Aug 28 Javascript
js实现简单的星级选择器提交效果适用于评论等
Oct 18 Javascript
JS实现仿QQ聊天窗口抖动特效
May 10 Javascript
jquery实现表格隔行换色效果
Nov 19 Javascript
基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)
Nov 17 Javascript
jQuery实现手机上输入后隐藏键盘功能
Jan 04 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
解决layui动态加载复选框无法选中的问题
Sep 20 Javascript
在webstorm中配置less的方法详解
Sep 25 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
Jul 13 #Javascript
JavaScript反弹动画效果的实现代码
Jul 13 #Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
Jul 13 #Javascript
详解vue-cli + webpack 多页面实例配置优化方法
Jul 13 #Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
Jul 13 #Javascript
js实现图片上传预览原理分析
Jul 13 #Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
Jul 13 #Javascript
You might like
PHP函数getenv简介和使用实例
2014/05/12 PHP
php通过session防url攻击方法
2014/12/10 PHP
Symfony实现行为和模板中取得request参数的方法
2016/03/17 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
angular学习之从零搭建一个angular4.0项目
2017/07/10 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
vue + element-ui的分页问题实现
2018/12/17 Javascript
Vue运用transition实现过渡动画
2019/05/06 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
简述Python中的进程、线程、协程
2016/03/18 Python
python目录与文件名操作例子
2016/08/28 Python
Apache如何部署django项目
2017/05/21 Python
使用python实现tcp自动重连
2017/07/02 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
Pytorch释放显存占用方式
2020/01/13 Python
python操作yaml说明
2020/04/08 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
中国电视购物:快乐购
2017/02/04 全球购物
巴西图书和电子产品购物网站:Saraiva
2017/06/07 全球购物
Casadei卡萨蒂官网:意大利奢侈鞋履品牌
2017/10/28 全球购物
LINUX下线程,GDI类的解释
2012/04/17 面试题
仓库管理计划书
2014/05/04 职场文书
高中毕业典礼演讲稿
2014/09/09 职场文书
鲁冰花观后感
2015/06/10 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
mysql的Buffer Pool存储及原理
2022/04/02 MySQL