springmvc 对 jsonp 的支持
在与前端开发人员合作过程中,经常遇到跨域名访问的问题,通常我们是通过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。
实现代码如下:
1 @ControllerAdvice(basePackages = "xxx.controller") 2 public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice { 3 4 private final String[] jsonpQueryParamNames; 5 6 public JsonpAdvice() { 7 super("callback", "jsonp"); 8 this.jsonpQueryParamNames = new String[]{"callback"}; 9 } 10 11 @Override 12 protected void beforeBodyWriteInternal(MappingJacksonValue bodyContainer, MediaType contentType, 13 MethodParameter returnType, ServerHttpRequest request, ServerHttpResponse response) { 14 15 HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest(); 16 17 //如果不存在callback这个请求参数,直接返回,不需要处理为jsonp 18 if (ObjectUtils.isEmpty(servletRequest.getParameter("callback"))) { 19 return; 20 } 21 //按设定的请求参数(JsonAdvice构造方法中的this.jsonpQueryParamNames = new String[]{"callback"};),处理返回结果为jsonp格式 22 for (String name : this.jsonpQueryParamNames) { 23 String value = servletRequest.getParameter(name); 24 if (value != null) { 25 MediaType contentTypeToUse = getContentType(contentType, request, response); 26 response.getHeaders().setContentType(contentTypeToUse); 27 bodyContainer.setJsonpFunction(value); 28 return; 29 } 30 } 31 } 32 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 我与微信审核的“相爱相杀”看个人小程序副业
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库