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 相关文章推荐
激活 ActiveX 控件
Oct 09 Javascript
ie下jquery.getJSON的缓存问题的处理方法
Mar 29 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
Jan 02 Javascript
JavaScript获取URL汇总
Jun 08 Javascript
js实现为a标签添加事件的方法(使用闭包循环)
Aug 02 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
Sep 08 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
Sep 04 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
Nov 13 Javascript
JavaScript 中的12种循环遍历方法【总结】
May 31 Javascript
使用webpack搭建vue项目实现脚手架功能
Mar 15 Javascript
详解Vue组件之间通信的七种方式
Apr 14 Javascript
vue的列表交错过渡实现代码示例
May 05 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
PHP实现微信公众平台音乐点播
2014/03/20 PHP
php 实现进制相互转换
2016/04/07 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
javascript数组去掉重复
2011/05/12 Javascript
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
2015/04/06 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
jquery实现左右滑动菜单效果代码
2015/08/27 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
2015/10/09 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
vuex实现简易计数器
2016/10/27 Javascript
jsonp跨域请求详解
2017/07/13 Javascript
Vue组件之Tooltip的示例代码
2017/10/18 Javascript
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
python导入时小括号大作用
2017/01/10 Python
python绘制简单折线图代码示例
2017/12/19 Python
关于多元线性回归分析——Python&amp;SPSS
2020/02/24 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
Python如何实现爬取B站视频
2020/05/20 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
描述JSP和Servlet的区别、共同点、各自应用的范围
2012/10/02 面试题
简历的自我评价
2014/02/03 职场文书
房产转让协议书
2014/04/11 职场文书
保护环境演讲稿
2014/05/10 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
党员自我评价范文2015
2015/03/03 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL
vue打包时去掉所有的console.log
2022/04/10 Vue.js
PYTHON 使用 Pandas 删除某列指定值所在的行
2022/04/28 Python