Jsonp跨域问题-callback无法生效
1 背景
问题:最近在参考网红视频写代码时遇到JS跨域问题,在照着把视频里面的代码复制一把之后竟然跨域问题没解决,callback的方法名无法在json的头部增加。debug日志显示已经取到后台数据并且返回时候已经调用了配置好的CallbackMappingJackson2HttpMessageConverter类,但奇怪的是debug不进入重写的writeInternal方法中的断点。
2 代码部分
Jsonp跨域的原理就不用解释,网上一大波,直接贴一个网友的链接,并附上对应转换json的代码.
@Override
protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
String callbackParam = request.getParameter(callbackName);
if(StringUtils.isEmpty(callbackParam)){
super.writeInternal(object, outputMessage);
}else{
JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
try {
String result =callbackParam+"("+super.getObjectMapper().writeValueAsString(object)+");";
IOUtils.write(result, outputMessage.getBody(),encoding.getJavaName());
}
catch (JsonProcessingException ex) {
throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
}
}
}
参考连接:https://blog.csdn.net/qq_1017097573/article/details/68924226
3 问题原因
3.1 spring-web包版本问题
在参考链接的评论部分解释的较为清楚:即spring-web包在某个版本之后,继承的父类源码中有两个同名的writeInternal重载函数,一个方法包含两个参数,另外一个方法是三个参数。当Controller返回数据的时候走到了三个参数的writeInternal函数中,所以相当于还是没有对json进行再封装
protected void writeInternal(Object object, Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
}
解决办法:把三个参数的writeInternal也重写一把,当然可以在三个参数的writeInternal去调用两个参数的writeInternal
3.2 Maven打包
在按照3.1把spring-web降级之后,发现仍然还是无法解决。最后发现需要重新对依赖的common包和parent包进行install,完美解决