Spring MVC 4.1 使用ResponseBodyAdvice支持jsonp
2016-03-10 16:05
483 查看
Spring MVC 4.1 使用ResponseBodyAdvice支持jsonp
?
作用:
Allows customizing the response after the execution of an {@code @ResponseBody} or an {@code ResponseEntity} controller method but before the body is written
with an {@code HttpMessageConverter}.
其中一个方法就是 beforeBodyWrite 在使用相应的HttpMessageConvert 进行write之前会被调用,就是一个切面方法。
和jsonp有关的实现类是AbstractJsonpResponseBodyAdvice,如下是 beforeBodyWrite 方法的实现,
?
位于AbstractJsonpResponseBodyAdvice的父类中,而beforeBodyWriteInternal是在AbstractJsonpResponseBodyAdvice中实现的 ,如下,
?
就是根据callback 请求参数或配置的其他参数来确定返回jsonp协议的数据。
如何实现jsonp?
首先继承AbstractJsonpResponseBodyAdvice ,如下,
?
super("callback", "jsonp");的意思就是当请求参数中包含callback 或 jsonp参数时,就会返回jsonp协议的数据。其value就作为回调函数的名称。
这里必须使用@ControllerAdvice注解标注该类,并且配置对哪些Controller起作用。关于注解@ControllerAdvice 的作用这里不做描述。
Controller实现jsonp,
?
jsonp2 方法就是 一个jsonp协议的调用。http://localhost:8081/jsonp2?callback=test可以直接调用这个方法,并且返回jsonp协议的数据。
通过debug代码,我们来看一下他是怎么返回jsonp协议的数据的。
正因为我们前面在 该Controller 上配置了 JsonpAdvice 的 ControllerAdvice,在调用 MappingJackson2HttpMessageConverter的write()方法往回写数据的时候,首先会调用
beforeBodyWrite,具体的代码如下,
?
当请求参数中含有配置的相应的回调参数时,就会bodyContainer.setJsonpFunction(value);这就标志着 返回的数据时jsonp格式的数据。
然后接下来就到了 MappingJackson2HttpMessageConverter 的write()方法真正写数据的时候了。看他是怎么写数据的,相关的代码如下,
?
?
?
代码非常清晰。看我们jsonp调用的结果。
?
响应消息如下,
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/javascript
Transfer-Encoding: chunked
Date: Sun, 19 Jul 2015 13:01:02 GMT
test({"id":1,"age":12,"name":"lyx"});
=================END=================
http://my.oschina.net/xinxingegeya/blog/480510?fromerr=yYIwo0JR
使用ResponseBodyAdvice支持jsonp
ResponseBodyAdvice是一个接口,接口描述,?
Allows customizing the response after the execution of an {@code @ResponseBody} or an {@code ResponseEntity} controller method but before the body is written
with an {@code HttpMessageConverter}.
其中一个方法就是 beforeBodyWrite 在使用相应的HttpMessageConvert 进行write之前会被调用,就是一个切面方法。
和jsonp有关的实现类是AbstractJsonpResponseBodyAdvice,如下是 beforeBodyWrite 方法的实现,
?
?
如何实现jsonp?
首先继承AbstractJsonpResponseBodyAdvice ,如下,
?
这里必须使用@ControllerAdvice注解标注该类,并且配置对哪些Controller起作用。关于注解@ControllerAdvice 的作用这里不做描述。
Controller实现jsonp,
?
通过debug代码,我们来看一下他是怎么返回jsonp协议的数据的。
正因为我们前面在 该Controller 上配置了 JsonpAdvice 的 ControllerAdvice,在调用 MappingJackson2HttpMessageConverter的write()方法往回写数据的时候,首先会调用
beforeBodyWrite,具体的代码如下,
?
然后接下来就到了 MappingJackson2HttpMessageConverter 的write()方法真正写数据的时候了。看他是怎么写数据的,相关的代码如下,
?
?
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/javascript
Transfer-Encoding: chunked
Date: Sun, 19 Jul 2015 13:01:02 GMT
test({"id":1,"age":12,"name":"lyx"});
=================END=================
http://my.oschina.net/xinxingegeya/blog/480510?fromerr=yYIwo0JR
相关文章推荐
- java BIO,NIO,AIO 理解
- spring注解注入:<context:component-scan>详解
- 数据库中多字段的排序 java实现
- java 操作 xls
- java.util.concurrent.RejectedExecutionException异常
- java 指定排序
- java SYNCHRONIZED
- Spring组件扫描<context:component-scan/>使用详解
- Java认证:对session和cookie的一些理解
- java 科学计数法 && 保留固定小数位数
- Java中堆内存和栈内存详解
- java进阶之路
- java并发编程实践学习笔记
- Spring整合Shiro做权限控制模块详细案例分析
- Sun的JDK里获取当前进程ID的方法(hack)
- Spring注入有继承关系的类
- Java ConcurrentHashMap 最佳实践
- eclipse 粘贴字符串自动添加转义符
- Java中的阻塞队列
- Eclipse打包插件Fat Jar 解压打包