fastjson springmvc jsonp兼容性问题

jdg4fx2g  于 2021-11-27  发布在  Java
关注(0)|答案(10)|浏览(359)

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;
   }
}
2nc8po8w

2nc8po8w1#

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

xtupzzrd

xtupzzrd2#

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

dojqjjoe

dojqjjoe3#

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

zy1mlcev

zy1mlcev4#

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

r7knjye2

r7knjye25#

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

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

axzmvihb

axzmvihb6#

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

1zmg4dgp

1zmg4dgp7#

@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();
}
yzuktlbb

yzuktlbb8#

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

8iwquhpp

8iwquhpp9#

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

1wnzp6jl

1wnzp6jl10#

see #1538
#1538 做了新的修改, ResponseJSONP可以注解在类上面。
MappingFastJsonValue改回了原来对jsonpFunction的非空判断。
revert 了之前一位朋友对JSONPObject的修改。

相关问题