spring boot 支持jsonp请求

news/2025/1/14 19:34:10/

spring boot 支持jsonp请求

项目中有用到 jsonp请求,那怎么使用spring boot 实现呢

实现

在不改动原有的框架基础上,对jsonp响应单独处理,即 实现 AbstractHttpMessageConverter:

public class JsonpHttpMessageConverter extends AbstractHttpMessageConverter<Object> {private final ObjectMapper objectMapper;public JsonpHttpMessageConverter(ObjectMapper objectMapper) {super(new MediaType("application", "javascript", StandardCharsets.UTF_8));this.objectMapper = objectMapper;}@Overrideprotected boolean supports(Class<?> clazz) {// 这里可以限制哪些类型的对象可以被序列化为 JSONP//响应的数据类型return JsonpController.DataM.class.isAssignableFrom(clazz);}@Overrideprotected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {throw new UnsupportedOperationException("Reading is not supported");}@Overrideprotected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {HttpServletRequest currentHttpRequest = getCurrentHttpRequest();String jsonpCallback = currentHttpRequest.getParameter("callback");if (jsonpCallback == null || jsonpCallback.isEmpty()) {// 如果没有提供回调函数,则默认返回 JSONobjectMapper.writeValue(outputMessage.getBody(), object);} else {// 获取请求参数中的 callback 参数值String callbackParam = jsonpCallback; // 实际应用中应该从请求对象中获取outputMessage.getBody().write((callbackParam + "(").getBytes(StandardCharsets.UTF_8));objectMapper.writeValue(outputMessage.getBody(), object);outputMessage.getBody().write(");".getBytes(StandardCharsets.UTF_8));}}public static HttpServletRequest getCurrentHttpRequest() {ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if (servletRequestAttributes != null) {return servletRequestAttributes.getRequest();}return null; // 或者抛出异常,取决于你的需求}
}

加入配置

@Configuration
public class WebConfig implements WebMvcConfigurer {private final ObjectMapper objectMapper;public WebConfig(ObjectMapper objectMapper) {this.objectMapper = objectMapper;}@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(0, new JsonpHttpMessageConverter(objectMapper));}
}

测试:

@RestController
public class UserController {@GetMapping("/index")public UserDto index(){UserDto user = new UserDto();user.setStartTime(LocalDateTime.now());return user;}@GetMapping("/test/data")public JsonpController.DataM getData(@RequestParam(value = "callback", required = false) String callback,HttpServletRequest request) throws IOException {JsonpController.DataM data = new JsonpController.DataM(); // 初始化你的数据对象data.setKey("a");data.setValue("b");return data;}
}

请求jsonp, http://localhost:8080/test/data?callback=callback:

# 响应类型为 text/plain
callback({"key":"a","value":"b"}

如果不带 callback:

# 响应类型为 text/plain
{"key":"a","value":"b"}

http://www.ppmy.cn/news/1563104.html

相关文章

ssh2-sftp-client和ssh2配合使用js脚本快速部署项目到服务器

有时候因为服务器不能实现github或者gitlab的自动部署服务&#xff0c;所以就需要使用脚本来实现自动部署&#xff0c;可以省时省力&#xff0c;一劳永逸。这里就使用ssh2-sftp-client和ssh2来实现&#xff0c;即便是需要sudo权限&#xff0c;也是可以的。 1.先将本地打包后的…

第六章:网页设计

文章目录&#xff1a; 一&#xff1a;网页设计 1.基本概念 1.1 网页 1.2 网站 1.3 工具 2.HTML语言 2.1 基础 2.2 标记 2.2.1 结构 2.2.2 文本 2.2.3 功能 2.2.4 表单 2.3 属性 二&#xff1a;IIS 1.定义 2.主要功能 3.特点与优势 4.应用场景 4.1 安装IIS …

open3d+opencv实现矩形框裁剪点云操作(C++)

&#x1f451;主页&#xff1a;吾名招财 &#x1f453;简介&#xff1a;工科学硕&#xff0c;研究方向机器视觉&#xff0c;爱好较广泛… ​&#x1f4ab;签名&#xff1a;面朝大海&#xff0c;春暖花开&#xff01; open3dopencv实现矩形框裁剪点云操作&#xff08;C&#xff…

R语言的语法糖

R语言的语法糖 引言 在编程语言中&#xff0c;所谓的“语法糖”是指那些使得程序员能够以更简洁、直观的方式书写代码的语法形式。R语言作为一种用于统计分析和数据可视化的编程语言&#xff0c;具有丰富的功能和灵活的语法。本文将深入探讨R语言中的语法糖&#xff0c;帮助读…

AI时代来了,我们不再需要IDE了

大家好&#xff0c;我是编程乐趣。 最近在思考一个问题&#xff0c;那就是AI这么强大。 未来有没有可能&#xff0c;我们就不需要不需要开发工具了&#xff0c;只需一个浏览器就可以开发软件了。 一、AI带来的变化 1、代码生成与补全 AI工具如GitHub Copilot等能够根据代码…

C# XPTable 日期字段处理(XPTable控件使用说明十三)

1、SQLite数据库定义为日期类型 2、XPtable中日期字段定义与显示 //显示时间表columnModel1.Columns.Clear();columnModel1.Columns.Add(new NumberColumn("id", 30));NumberColumn numberColumn new NumberColumn("次数", 50);numberColumn.Maximum 100…

Redis解决热key问题

当Redis遇到热key问题时&#xff0c;即某个或某些key被频繁访问&#xff0c;可能导致单个Redis节点负载过高&#xff0c;影响整个系统性能。以下是一些常见的解决方案&#xff1a; 1. 缓存预热与复制 缓存预热&#xff1a;在系统启动阶段&#xff0c;将热key对应的value预先加…

【芯片设计- RTL 数字逻辑设计入门 9.2 -- flip flop 与 寄存器的关系详细介绍】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 Overview硬件角度的 Flip-Flop软件角度的寄存器举例说明硬件设计角度软件开发角度D Flip-Flop 实现基本原理:Verilog 代码:UT 示例JK Flip-Flop 实现基…