原:
后台controller中 需要 返回 【 callback(json数据)】
改进的做法:
改进后所有 后台controller中的接口返回参数不用做任何改变;
之前的格式是需要 返回 【 callback(json数据)】
工具类pom.xml 需要加两个包;
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>
CallbackMappingJackson2HttpMessageConverter.java 工具类
package com.igeek.util;
import java.io.IOException;
import java.lang.reflect.Type;
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;
import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice;
public class CallbackMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
// 做jsonp的支持的标识,在请求参数中加该参数
private String callbackName;
@Override
protected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
// 从threadLocal中获取当前的Request对象
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.currentRequestAttributes()).getRequest();
String callbackParam = request.getParameter(callbackName);
System.out.println("获取callback------>"+callbackName+"=====>"+callbackParam);
if (StringUtils.isEmpty(callbackParam)) {
// 没有找到callback参数,直接返回json数据
super.writeInternal(o, outputMessage);
} else {
JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
try {
String result = callbackParam + "(" + super.getObjectMapper().writeValueAsString(o)
+ ");";
IOUtils.write(result, outputMessage.getBody(), encoding.getJavaName());
} catch (JsonProcessingException ex) {
throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
}
}
}
/*@Override
protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException,
HttpMessageNotWritableException {
// 从threadLocal中获取当前的Request对象
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.currentRequestAttributes()).getRequest();
String callbackParam = request.getParameter(callbackName);
System.out.println("获取callback------>"+callbackName+"=====>"+callbackParam);
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;
}
}
配置消息转换器:(提供服务的项目 SpringMVC.xml )中配置
<!-- 配置注解驱动 -->
<!-- 配置消息转换器-->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<!-- (解决中文乱码问题)-->
<!--<bean
class="org.springframework.http.converter.StringHttpMessageConverter" >
<constructor-arg index="0" value="UTF-8"></constructor-arg>
</bean>-->
<!--定义消息转换器时指定回调函数的名称-->
<bean class="com.igeek.util.CallbackMappingJackson2HttpMessageConverter">
<property name="callbackName" value="callback"></property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
页面 index.jsp 跨域获取数据
/**
* 通过ajax请求加载内容数据
*/
$.ajax({
url:'http://manage.ebuy.com/api/content/list/89',
type:'get',
dataType:'jsonp',
jsonp:'callback',//jsonp类型:String 在一个 jsonp 请求中重写回调函数的名字。
success:function(data){
if(data.status==200){
for (var i in data.data){
var li_ele = '<li><a name=\"sfbest_hp_hp_focus_1\" class=\"fore_pic trackref\" href=\"'+data.data[i].url+'\" target=\"_blank\">' +
'<img id=\"lunbo_1\" alt=\"'+data.data[i].content+'\" src=\"'+data.data[i].pic+'\"></a></li>';
$("#ebuy_banner").html($("#ebuy_banner").html()+li_ele);
var idx_ele = '<li class=\"'+(i==0?"cur":"")+'\">'+(parseInt(i)+1)+'</li>';
$("#lunboNum").html($("#lunboNum").html()+idx_ele);
}
SFbest.Slide.init();
}
}
});