SpringBoot - MappingJackson2HttpMessageConverter 功能增強:添加 jsonp 請求響應(新)

網上充斥着 類似(下面) 的無腦回答

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章