博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jsonp跨域请求
阅读量:6952 次
发布时间:2019-06-27

本文共 2736 字,大约阅读时间需要 9 分钟。

前端时间因为太忙,一直没有处理跨域这个事情,今天抽了一个小时轻松解决,突然发现上个月又写了很多重复代码。因为现在公司项目分为多个工程,前后端完全分离,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')格式的数据返回给前端。

 

3.前端通过jquery封装的ajax方式调用,这里做了一些代码节省,关键代码已红色标出

 

4.浏览器打印log

 

转载于:https://www.cnblogs.com/liliangel/p/5760426.html

你可能感兴趣的文章
oralce入门学习
查看>>
编程开发之--java多线程学习总结(4)
查看>>
字符串匹配
查看>>
mysql搭建及数据迁移教程
查看>>
Python文档学习笔记(1)--使用Python 解释器
查看>>
myeclipse 8.5安装freemarker插件方法
查看>>
10 款最好的远程桌面软件
查看>>
JxBrowser之四:对Http Response Code的处理
查看>>
Linux课程---3、Linux远程登录和传输(操作Linux服务器软件)
查看>>
前端模板资源
查看>>
不仅仅是Google,您必须知道的全球十大地图API
查看>>
php排序
查看>>
JSP与Servlet之间传值
查看>>
JavaScript&jQuery.动态删除元素
查看>>
pickle和json模块
查看>>
Python基本语法_输入/输出语句详解
查看>>
用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
查看>>
快速入门分布式消息队列之 RabbitMQ(2)
查看>>
IIS安装与部署,站点的部署与配置
查看>>
Google两步验证的工作原理
查看>>