【springboot】【若依(ruoyi)】@RestController 接口支持 JSONP

前言

  • 若依(ruoyi): v4.3
  • springboot 2.1.1.RELEASE
  • spring 5.1.3.RELEASE
  • 360极速浏览器 12.0.1476.0 (正式版本) (32 位)
  • jquery 3.5.0

简单来说,@RestController 接口支持 JSONP 需要对返回结果用callback包裹。

需求为:

  • jsonpCallback 固定为 callback
  • JSONP 开关参数为 jsonp。比如:http://localhost:8085/api/sample/form/get1?jsonp=1输出 callback({"code":0,"msg":"OK"});http://localhost:8085/api/sample/form/get1 输出 {"code":0,"msg":"OK"}

操作步骤

  • 编写 MappingJackson2HttpMessageConverterSupportJsonp类,且继承 MappingJackson2HttpMessageConverter 类。
  • MappingJackson2HttpMessageConverterSupportJsonp类中覆盖 writePrefix(在输出时,添加前缀) 和 writeSuffix(在输出时,添加后缀)。
  • 使用 MappingJackson2HttpMessageConverterSupportJsonp Bean 替换 MappingJackson2HttpMessageConverter Bean。

代码如下:

@Configuration
public class JsonpSupportConfig {

	@Bean
	public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(
			ObjectMapper objectMapper) {
		return new MappingJackson2HttpMessageConverterSupportJsonp(objectMapper);
	}
	
	private static class MappingJackson2HttpMessageConverterSupportJsonp extends MappingJackson2HttpMessageConverter {
		private final String PARAM_JSONP = "jsonp";
		public MappingJackson2HttpMessageConverterSupportJsonp(ObjectMapper objectMapper) {
			super(objectMapper);
		}
		
		@Override
		protected void writePrefix(JsonGenerator generator, Object object) throws IOException {
			if (this.isJsonp(object)) {
				generator.writeRaw("callback(");
			}
		}
		
		@Override
		protected void writeSuffix(JsonGenerator generator, Object object) throws IOException {
			if (this.isJsonp(object)) {
				generator.writeRaw(")");
			}
		}
		
		private boolean isJsonp(Object object) {
			RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
			ServletRequestAttributes servletAttributes = (ServletRequestAttributes) attributes;
			HttpServletRequest request = servletAttributes.getRequest();
			String jsonpStr = request.getParameter(PARAM_JSONP);
			
			if ("0".equals(jsonpStr)) { return false; }
			if ("1".equals(jsonpStr)) { return true; }
			return Boolean.valueOf(jsonpStr);
		}
		
	}
}

效果图:
在这里插入图片描述
在这里插入图片描述

spring boot 对 jsonp 的支持问题

spring 5.1 之前可以使用 AbstractJsonpResponseBodyAdvice 支持JSONP,spring 5.1之后将其移除了。

AbstractJsonpResponseBodyAdvice was deprecated starting from Spring 5.0.7 and 4.3.18 and in version 5.1 it is completely removed.

因为随着时间的推移,浏览器都支持了 CROS 。CROS 要比 JSONP 好。工作中,逐渐的转投 CROS。

参考

https://blog.csdn.net/sayyy/article/details/108399070
https://stackoverflow.com/questions/52845927/how-to-handle-jsonp-spring-framework-5-1

猜你喜欢

转载自blog.csdn.net/sayyy/article/details/108405040