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 相关文章推荐
js读取cookie方法总结
Oct 31 Javascript
Javascript快速排序算法详解
Dec 03 Javascript
node.js中的fs.utimesSync方法使用说明
Dec 15 Javascript
jquery仿百度经验滑动切换浏览效果
Apr 14 Javascript
JS中的二叉树遍历详解
Mar 18 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
Apr 15 Javascript
Angularjs实现控制器之间通信方式实例总结
Mar 27 Javascript
Vue二次封装axios为插件使用详解
May 21 Javascript
vue实现循环切换动画
Oct 17 Javascript
vue实现手机端省市区区域选择
Sep 27 Javascript
JavaScript中的各种宽高属性的实现
May 08 Javascript
JavaScript语法约定和程序调试原理解析
Nov 03 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
3种平台下安装php4经验点滴
2006/10/09 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
composer.lock文件的作用
2016/02/03 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
JavaScript单元测试ABC
2012/04/12 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
javascript实现的一个带下拉框功能的文本框
2014/05/08 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
javascript倒计时效果实现
2015/11/12 Javascript
基于JavaScript实现百叶窗动画效果不只单纯flas可以实现
2016/02/29 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
ES6实现的遍历目录函数示例
2017/04/07 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
Vue渲染函数详解
2017/09/15 Javascript
实例讲解JS中pop使用方法
2019/01/27 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
Python转码问题的解决方法
2008/10/07 Python
python编码最佳实践之总结
2016/02/14 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
2019/01/04 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
python如何判断IP地址合法性
2020/04/05 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
台湾前三大B2C购物网站:MOMO购物网
2017/04/27 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
办公室内勤岗位职责范本
2013/12/09 职场文书
教师通用专业自荐书范文
2014/02/11 职场文书
产品陈列协议书(标准版)
2014/09/17 职场文书
简单租房协议书
2014/10/21 职场文书
歌舞青春观后感
2015/06/10 职场文书
家庭贫困证明
2015/06/16 职场文书
儿子满月酒致辞
2015/07/29 职场文书
大学生党课感想
2015/08/11 职场文书
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android