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 parseInt() 函数的进制转换注意细节
Jan 08 Javascript
JQuery的Ajax跨域请求原理概述及实例
Apr 26 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
Oct 20 Javascript
动态添加option及createElement使用示例
Jan 26 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
May 23 Javascript
JS回调函数的应用简单实例
Sep 17 Javascript
jquery常用函数与方法汇总
Sep 01 Javascript
js简单倒计时实现代码
Apr 30 Javascript
浅谈JavaScript 标准对象
Jun 02 Javascript
arcgis for js 修改infowindow样式的方法
Nov 02 Javascript
jQuery 的 ready()的纯js替代方法
Nov 20 Javascript
JS扩展类,克隆对象与混合类实例分析
Nov 26 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
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
php之XML转数组函数的详解
2013/06/07 PHP
php获取错误信息的方法
2015/07/17 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
JavaScript中的闭包原理分析
2010/03/08 Javascript
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
2014/06/22 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
Bootstrap每天必学之表单
2015/11/23 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
2018/08/14 Javascript
vue 点击按钮实现动态挂载子组件的方法
2018/09/07 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
[55:03]LGD vs EG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
在Python中使用模块的教程
2015/04/27 Python
基于Python实现对PDF文件的OCR识别
2016/08/05 Python
python difflib模块示例讲解
2017/09/13 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
python游戏地图最短路径求解
2019/01/16 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
十佳大学生事迹材料
2014/01/29 职场文书
介绍信的格式
2015/01/30 职场文书
车间统计员岗位职责
2015/04/14 职场文书
银行服务理念口号
2015/12/25 职场文书
python入门学习关于for else的特殊特性讲解
2021/11/20 Python
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫
浅谈Redis的事件驱动模型
2022/05/30 Redis