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中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
Nov 03 Javascript
关于JS字符串函数String.replace()
Apr 07 Javascript
js HTML5手机刮刮乐代码
Sep 29 Javascript
jQuery实现获取h1-h6标题元素值的方法
Mar 06 Javascript
深入理解vue路由的使用
Mar 24 Javascript
JavaScript编写的网页小游戏,很给力
Aug 18 Javascript
详解使用Typescript开发node.js项目(简单的环境配置)
Oct 09 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
Aug 22 Javascript
详解vue项目中调用百度地图API使用方法
Apr 25 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
Sep 05 Javascript
微信小程序实现拖拽功能
Sep 26 Javascript
vue如何使用rem适配
Feb 06 Vue.js
解决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
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
2007/03/15 PHP
五个PHP程序员工具
2008/05/26 PHP
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
2017/05/20 PHP
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
jQuery中removeData()方法用法实例
2014/12/27 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
jQuery实现为LI列表前3行设置样式的方法【2种方法】
2016/09/04 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
使用express搭建一个简单的查询服务器的方法
2018/02/09 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
jQuery+ajax实现批量删除功能完整示例
2019/06/06 jQuery
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
微信小程序bindtap事件与冒泡阻止详解
2019/08/08 Javascript
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
python fabric实现远程部署
2017/01/05 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
python numpy 反转 reverse示例
2019/12/04 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
Python实现列表索引批量删除的5种方法
2020/11/16 Python
GUESS西班牙官方网上商城:美国服饰品牌
2017/03/15 全球购物
法国二手MacBook销售网站:Okamac
2019/03/18 全球购物
幼儿如何来做好自我评价
2013/11/05 职场文书
银行工作检查书范文
2014/01/31 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
工作失误检讨书范文
2015/01/26 职场文书
酒店采购员岗位职责
2015/04/03 职场文书
如何用threejs实现实时多边形折射
2021/05/07 Javascript
oracle设置密码复杂度及设置超时退出的功能
2022/06/28 Oracle