jsonp原理
js 是可以访问跨域资源的(通过ajax异步请求,或者通过src标签),但是浏览器对js的跨域做了限制,通过jsonp原理跳出浏览器限制,在页面中定义一个回调函数,来获取到资源.
springMvc4.1之后:
①@ControllerAdvice加上这个注解
②实现AbstractJsonpResponseBodyAdvice
如下:
springMvc4.1之前:
方法:继承原来的消息处理器,然后加上自已的消息处理内容
①新建一个类继承MappingJackson2HttpMessageConverter
②重写writeInternal方法
③在mvc注解驱动中配置自定义的消息处理器
代码实现如下:
--------------------------------------------------------------------------------------------------------------------
public class JsonpHttpMessageConverter extends MappingJackson2HttpMessageConverter{
//做一个jsonp支持标识
private String callbackName;
@Override
protected void writeInternal(Object object, HttpOutputMessage outputMessage){
//如何获取HttpServletRequest
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
String methodName = request.getParameter(callbackName);
try {
if (StringUtils.isEmpty(methodName)) {
//没有callback函数,走原来的json格式支持
super.writeInternal(object, outputMessage);
}else{
//有callback方法名,支持jsonp
JsonEncoding jsonEncoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
String result = methodName+"("+super.getObjectMapper().writeValueAsString(object)+")";
IOUtils.write(result, outputMessage.getBody(),jsonEncoding.getJavaName());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
------------------------------------------------------------------------------------------------------------------
<!-- 注解驱动 -->
<mvc:annotation-driven>
<mvc:message-converters>
<!-- 默认的消息处理器字符串类型消息处理器 -->
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg index="0" value="UTF-8"/>
</bean>
<!-- 自定义消息处理器 -->
<bean id="jsonpHttpMessageConverter" class="com.atguigu.sso.message.converter.JsonpHttpMessageConverter">
<!-- 设置属性值:请求的方法名的参数 -->
<property name="callbackName" value="callback"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
-----------------------------------------------------------------------------------------------------------------------