網上充斥着 類似(下面) 的無腦回答
@ControllerAdvice(basePackages = "com.controller")
public class Jsonp extends AbstractJsonpResponseBodyAdvice {
public Jsonp() {
//構造函數
super("callback","jsonp");
}
}
然而 AbstractJsonpResponseBodyAdvice
這個類 spring 官方找廢棄了。
(可能考慮到 jsonp 這個技術 有點 low ,遲早要淘汰把)
但是,奈何不了我們可愛的前端喜歡用啊。
功能還是要實現的。(下面)
就是用 RequestContextHolder
這個 ThreadLocal
獲得當前線程的 request
判斷一下,有需要就做個 字符串拼接
package cn.test.config;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.fasterxml.jackson.core.JsonGenerator;
@Configuration
public class JsonpConfig {
@Bean
public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() {
return new MappingJackson2HttpMessageConverter() {
// 做jsonp的支持的標識,在請求參數中加該參數
private final static String CALLBACK = "callback";
// 獲取callback參數
private String parseCallbackParam() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.currentRequestAttributes()).getRequest();
return request.getParameter(CALLBACK);
}
@Override
protected void writePrefix(JsonGenerator generator, Object object) throws IOException {
String callback = parseCallbackParam();
if (!StringUtils.isEmpty(callback))
generator.writeRaw(callback + "(");
}
@Override
protected void writeSuffix(JsonGenerator generator, Object object) throws IOException {
String callback = parseCallbackParam();
if (!StringUtils.isEmpty(callback))
generator.writeRaw(")");
}
};
}
}