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模块化是什么及其优缺点介绍
Sep 02 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
Dec 28 Javascript
jQuery中click事件的定义和用法
Dec 20 Javascript
浅析webapp框架AngularUI的demo
Dec 21 Javascript
JQuery.get提交页面不跳转的解决方法
Jan 13 Javascript
javascript实现网页端解压并查看zip文件
Dec 15 Javascript
three.js加载obj模型的实例代码
Nov 10 Javascript
详解Angular调试技巧之报错404(not found)
Jan 31 Javascript
垃圾回收器的相关知识点总结
May 13 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
Aug 12 Javascript
浅谈React碰到v-if
Nov 04 Javascript
vue+Element中table表格实现可编辑(select下拉框)
May 21 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
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
PHP简单选择排序算法实例
2015/01/26 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
php用户名的密码加密更安全的方法
2019/06/21 PHP
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
JavaScript中__proto__与prototype的关系深入理解
2012/12/04 Javascript
鼠标选择动态改变网页背景颜色的JS代码
2013/12/10 Javascript
JS循环遍历JSON数据的方法
2014/07/08 Javascript
JavaScript导出Excel实例详解
2014/11/25 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
浅谈如何实现easyui的datebox格式化
2016/06/12 Javascript
js删除局部变量的实现方法
2016/06/25 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
浅谈Node 调试工具入门教程
2018/03/20 Javascript
jQuery实现的简单对话框拖动功能示例
2018/06/05 jQuery
小程序实现日历左右滑动效果
2019/10/21 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
[01:36]DOTA2完美大师赛趣味视频之与队友相处的十万个技巧
2017/11/19 DOTA
用PyQt进行Python图形界面的程序的开发的入门指引
2015/04/14 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
网络信息管理员岗位职责
2014/01/05 职场文书
花店创业计划书范文
2014/02/07 职场文书
党的群众路线学习材料
2014/05/16 职场文书
快递员岗位职责
2014/09/12 职场文书
催款律师函范文
2015/05/27 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang
frg-100简单操作(设置)说明
2022/04/05 无线电