如何处理JSONP(Spring Framework 5.1)



从Spring 5.1迁移到Spring 4时,我很难处理JSONP

Spring 4 为 jsonp 提供了 AbstractJsonpResponseBodyAdvice 类

然而,AbstractJsonpResponseBodyAdvice 类在 Spring 5 中消失了。

春季5.1有补课吗???

AbstractJsonpResponseBodyAdvice

从Spring 5.0.7 和 4.3.18 开始被弃用,在 5.1 版中被完全删除。Spring 5.1 中没有直接的替代品,而不是使用不安全的 JSON-P,您应该在 CORS(跨域资源共享(上迁移,它允许您指定授权的跨域请求类型。

在春季文档中阅读有关 CORS 的更多信息:https://docs.spring.io/spring/docs/5.0.x/spring-framework-reference/web.html#mvc-cors

关于 SO 上的 CORS 也有很多问题 - 例如:如何在 Spring Boot + Spring Security 应用程序中配置 CORS?


当然,总有一个肮脏的选项,您可以将AbstractJsonpResponseBodyAdvice类及其所有依赖项开膛破肚到单独的 jar 中,并将其与新版本的 Spring 一起使用,但我认为最好从 CORS 开始;-(

我用原始代码处理它:

// http://127.0.0.1:8080/jsonp/test?callback=json_123456
@GetMapping(value = "/test")
public void testJsonp(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
@RequestParam(value = "callback", required = false) String callback) throws IOException {
JSONObject json = new JSONObject();
json.put("a", 1);
json.put("b", "test");
String dataString = json.toJSONString();
if (StringUtils.isBlank(callback)) {
httpServletResponse.setContentType("application/json; charset=UTF-8");
httpServletResponse.getWriter().print(dataString);
} else {
// important: contentType must be text/javascript
httpServletResponse.setContentType("text/javascript; charset=UTF-8");
dataString = callback + "(" + dataString + ")";
httpServletResponse.getWriter().print(dataString);
}
//        return dataString;
}

最新更新