在与前端开发人员合作过程中,经常遇到跨域名访问的问题,通常我们是通过jsonp调用方式来解决。jsop百科:http://baike.baidu.com/link?url=JKlwoETqx2uuKeoRwlk_y6HZ9FZxXTARLwm7QFOmuqex5p6-Ch5GQpSM5juf614F8hYaP2N3wDkU26slwvtnOa

如:请求 http://xxxx?&callback=exec , 那么返回的jsonp格式为 exec({"code":0, "message":"success"}); 。 其实对于格式的重新封装并不复杂,但是对于某个请求既要支持json返回也要支持jsop返回怎么做,那我们就得做个判断, if(request.getParameter("callback")  != null),  如果存在就返回jsonp, 不存在就返回json。

在使用springmvc的场景下,如何利用springmvc来返回jsonp格式,有很多方式可以实现。 这里介绍一种比较简单但比较通用的处理方式。前提是你使用的springmvc是4.1版本及以上。主要是要继承类AbstractJsonpResponseBodyAdvice, 并加入@ControllerAdvice 这个注解,basePackages 标识要被处理的controller。

实现代码如下:

 @ControllerAdvice(basePackages = "xxx.controller")
public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice { private final String[] jsonpQueryParamNames; public JsonpAdvice() {
super("callback", "jsonp");
this.jsonpQueryParamNames = new String[]{"callback"};
} @Override
protected void beforeBodyWriteInternal(MappingJacksonValue bodyContainer, MediaType contentType,
MethodParameter returnType, ServerHttpRequest request, ServerHttpResponse response) { HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest();
     
     //如果不存在callback这个请求参数,直接返回,不需要处理为jsonp
if (ObjectUtils.isEmpty(servletRequest.getParameter("callback"))) {
return;
}
     //按设定的请求参数(JsonAdvice构造方法中的this.jsonpQueryParamNames = new String[]{"callback"};),处理返回结果为jsonp格式
for (String name : this.jsonpQueryParamNames) {
String value = servletRequest.getParameter(name);
if (value != null) {
MediaType contentTypeToUse = getContentType(contentType, request, response);
response.getHeaders().setContentType(contentTypeToUse);
bodyContainer.setJsonpFunction(value);
return;
}
}
}
}

springmvc对jsonp的支持的更多相关文章

  1. springmvc 对 jsonp 的支持

    在与前端开发人员合作过程中,经常遇到跨域名访问的问题,通常我们是通过jsonp调用方式来解决.jsop百科:http://baike.baidu.com/link?url=JKlwoETqx2uuKe ...

  2. MVC.Net:WebAPI添加对jsonP的支持

    在某些情况下,我们需要在WebAPI项目中添加对jsonP的支持.比如我们同时创建了MVC.Net和WebAPI两个项目,这两个项目使用不同的端口,这时如果MVC.Net项目的前端想要直接访问WebA ...

  3. SpringMVC JSONP JSON支持

    1.ajax端 $.ajax({ type: "post", dataType: "jsonp", //传递给请求处理程序,用以获得jsonp回调函数名的参数名 ...

  4. jsonp使用,spring4.x对jsonp的支持

    1.Java中接口 @RequestMapping("/token/{token}") @ResponseBody public Object getUserByToken(@Pa ...

  5. springMVC多视图的支持

    1.在springmvc.xml中加上 <!-- 多视图的支持 --> <bean class="org.springframework.web.servlet.view. ...

  6. springmvc上传图片并显示--支持多图片上传

    实现上传图片功能在Springmvc中很好实现.现在我将会展现完整例子. 开始需要在pom.xml加入几个jar,分别是: <dependency> <groupId>comm ...

  7. 【SpringMVC学习10】SpringMVC对RESTfull的支持

    RESTful架构,就是目前流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用.RESTful架构对url进行规范,写RESTful格式的url是什么样子 ...

  8. springMVC对RESTful的支持

    1:后台controller方法编写 @RequestMapping("/itemsLook/{id}") public ItemsCustom itemsLook(@PathVa ...

  9. (十四)springMvc 对 restful 的支持

    文章目录 restful 的概念 配置支持 restful 的前端控制器 配置不拦截静态资源 restful 的概念 restful 是一种开发理念: 对 url 进行规范 每个 url 代表一个资源 ...

随机推荐

  1. 转载:C# 之泛型详解

    本文原地址:http://www.blogjava.net/Jack2007/archive/2008/05/05/198566.html.感谢博主分享! 什么是泛型 我们在编写程序时,经常遇到两个模 ...

  2. jquery.placeholder.js的使用

    最近做东西用到placeholder这个属性,可是这个属性在低版本的IE或者QQ浏览器等这些浏览器上这个属性不能生效,后来在网上查了下,发现了jquery的一个插件jquery.placeholder ...

  3. 登录模块需要用到session留底

    <% HttpSession sessions=request.getSession(); Object sessionValues=sessions.getAttribute("ui ...

  4. (转)PHP中extract()函数的妙用

    近日在看一个牛人的代码时,看到一个非常好用的函数:extract(),它的主要作用是将数组展开,键名作为变量名,元素值为变量值,可以说为数组的操作提供了另外一个方便的工具,比方说,可以很方便的提取$_ ...

  5. target,currentTarget,delegateTarget,srcElement

    第一种情况:就是IE9+和其他现代浏览器,支持addEventListener方法.其结果是: this总是等于currentTarget currentTarget总是事件监听者 target总是事 ...

  6. oracle查询表信息(索引,外键,列等)

    oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助:1.查询出所有的用户表 select * from user_tables ...

  7. java 每天一练(二)

    public static void main(String[] args) {    for (int i = 2; i <1000; i++) {        int sum=0;     ...

  8. uvalive3026 Period (KMP+结论)

    题目链接:http://vjudge.net/problem/viewProblem.action?id=29342 题目大意:给定字符串,找到每个前缀的最大循环节的个数. 首先当然是kmp预处理,接 ...

  9. 【POJ1753】Flip Game

    [题目大意] 有一个4x4规格的一个棋盘,现在有16个一面黑一面白的棋子分布在这个棋盘上. 翻转一个棋子能够使它以及它上下左右的四个棋子从黑变白,从白变黑. 现在问你至少要经过多少次操作才能够使得整个 ...

  10. sql编程 1

    declare emp_count number;begin select count(*) into emp_count from emp where HIOREDATE >= TO_DATE ...