[alibaba/fastjson]springmvc jsonp兼容性问题

2025-11-11 746 views
5

com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter中MappingFastJsonValue未做jsonp判断,直接返回jsonp了

//jsonp,保留对原本直接返回MappingFastJsonValue方法的支持
//更好的方式是直接返回com.alibaba.fastjson.JSONPObject
if (value instanceof MappingFastJsonValue) {
    isJsonp = true;
    value = ((MappingFastJsonValue) value).getValue();
} else if (value instanceof JSONPObject) {
    if(!(((JSONPObject) value).getFunction() == null) && !("".equals(((JSONPObject) value).getFunction()))){
        isJsonp = true;
   }
}

回答

6

看起来有没有判断都是一样的哦。 既然用了这个JSONPObject 就是jsonp了

3

是这样的,以前接口要不要跨域是前端控制的前端带了callback参数就返回javascript,不带还是按json数据返回,现在如果不做判断就不能兼容老版本了

8

1.2.35及之前版本没问题,升级之后就出现这个问题了...

5

返回的数据是json,但Response header不对,应该是content-type →application/json 现在变成了content-type →application/javascript

1

contentType是application/json 但是返回的内容其实是个javascript ,你们前端都没有问题吗?

如果JSONPObject中的function字段为null或者"" 就会返回数据 null({}) 或者 ({})

2

当前fastjson做了处理,默认为(即jsonp): public static final MediaType APPLICATION_JAVASCRIPT = new MediaType("application", "javascript"); 如果你想返回纯json对象,请在返回的对象上加入@JsonView注解,或者你通过spring注解@ControllerAdvice自定义ResponseBodyAdvice

6

@neil4dong 前端出问题了所以才来提这个问题,业务代码没有做什么变动,只是升级了fastjson版本就出问题,小版本升级建议向下做个兼容

现在我自已重写了下方法protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException

if (value instanceof MappingFastJsonValue) {
    MappingFastJsonValue mfjv = (MappingFastJsonValue) value;
    if(mfjv.getJsonpFunction() != null && !"".equals(mfjv.getJsonpFunction())){
        isJsonp = true;
    }
    value = mfjv.getValue();
}
5

提供一下旧版本的版本号呢。 我看下能不能做个兼容。

8

1.2.35版本或之前的版本都可以..

5

see #1538

1538 做了新的修改, ResponseJSONP可以注解在类上面。

MappingFastJsonValue改回了原来对jsonpFunction的非空判断。 revert 了之前一位朋友对JSONPObject的修改。