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 相关文章推荐
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
Mar 07 Javascript
数组方法解决JS字符串连接性能问题有争议
Jan 12 Javascript
js加强的经典分页实例
Mar 15 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
Jun 25 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
May 07 Javascript
jQuery自定义图片上传插件实例代码
Apr 04 jQuery
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
May 07 Javascript
12个非常有用的JavaScript技巧
May 17 Javascript
JavaScript递归算法生成树形菜单
Aug 15 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
Aug 31 Javascript
详解微信小程序支付流程与梳理
Jul 16 Javascript
vue瀑布流组件实现上拉加载更多
Mar 10 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
电脑硬件及电脑配置知识大全
2020/03/17 数码科技
重置版宣传动画
2020/04/09 魔兽争霸
php下关于Cannot use a scalar value as an array的解决办法
2010/08/08 PHP
从php核心代码分析require和include的区别
2011/01/02 PHP
php命名空间学习详解
2014/02/27 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
2013/08/18 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
angularjs实现时间轴效果的示例代码
2017/11/29 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
javaScript实现一个队列的方法
2020/07/14 Javascript
用python实现批量重命名文件的代码
2012/05/25 Python
Python 实现链表实例代码
2017/04/07 Python
python先序遍历二叉树问题
2017/11/10 Python
浅析python中while循环和for循环
2019/11/19 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
2020/02/03 Python
Python实现屏幕录制功能的代码
2020/03/02 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
西班牙用户之间买卖视频游戏的平台:Wakkap
2020/03/21 全球购物
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
护士自我鉴定怎么写
2014/02/07 职场文书
模范班主任事迹材料
2014/12/17 职场文书
Python爬虫基础初探selenium
2021/05/31 Python
Python jiaba库的使用详解
2021/11/23 Python
分享几个实用的CSS代码块
2022/06/10 HTML / CSS