spring boot 支持jsonp请求

devtools/2025/1/15 1:15:44/

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/devtools/150539.html

相关文章

抖音集团数据血缘深度应用:架构、指标与优化实践

导读 本文简单介绍了“抖音集团数据资产管理平台”全貌,数据资产管理平台是抖音集团在复杂业务场景中思考的新方向,启发大家对于元数据以及数据资的全新思考。文章重点展开介绍了“抖音集团大数据血缘的演进和应用”部分,让大家以更宏观视角认识血缘,并在如何建设好数据血缘…

6Hive Sql 大全

6Hive Sql 大全 1hive 的 DDL 语法1.1对数据库的操作1.2对数据表的操作对管理表(内部表)的操作:对外部表操作对分区表的操作对分桶表操作修改表和删除表向hive表中加载数据hive表中数据导出 2hive 的 DQL 查询语法2.1单表查询WHERE语句GROUP BY 分组join 连接order by 排序sort…

Zookeeper单机操作

个人博客地址&#xff1a;Zookeeper单机操作 | 一张假钞的真实世界 下载 从Apache下载镜像站点下载当前稳定发布版。 单机操作 安装单机模式的Zookeeper服务器是简单明了的。服务器包含在一个单独的JAR文件中&#xff0c;因此安装包含创建配置。 下载稳定的ZooKeeper发布版…

【数据结构】树的定义

在计算机科学中&#xff0c;树&#xff08;Tree&#xff09;是一种重要的基础数据结构&#xff0c;广泛应用于许多领域&#xff0c;如文件系统的目录结构、数据库的索引、编译器的语法树、人工智能的决策树等。理解树的基本概念和术语&#xff0c;对于学习计算机科学及其相关技…

【数据结构-堆】力扣1834. 单线程 CPU

给你一个二维数组 tasks &#xff0c;用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务队列&#xff0c;需要 processingTimei 的时长完成执行。 现…

SVM支持向量机

目录 算法原理 数学基础 向量内积&#xff08;向量点乘&#xff09; 范数 对偶问题 拉格朗日乘子法 ​线性可分与线性不可分 线性可分 线性不可分 超平面 超平面的定义 超平面的作用 如何寻找最优的超平面 损失函数求解 软间隔 鲁棒性 核函数 算法优缺点 优点…

系统看门狗配置--以ubuntu为例

linux系统配置看门狗 以 ubuntu 系统配置看门狗为例 配置看门狗使用的脚本文件&#xff0c;需要使用管理员权限来执行&#xff1a; 配置是&#xff1a;系统每 30S 喂一次狗&#xff0c;超过 60S 不进行投喂&#xff0c;就会自动重启。 1. 系统脚本内容&#xff1a; #!/bin/b…

Python的循环

Python的循环 Python的循环有两种&#xff0c;分别是for…in循环和while循环。 for…in 循环 假设我们要循环输出一个列表里的元素&#xff1a; names [张三,李四,王五] for name in names:print(name)执行这段代码后&#xff0c;会依次打印names的每一个元素&#xff1a;…