首先我们在mvc配置文件加上
<mvc:annotation-driven content-negotiation-manager="negotiationManager"> <!-- register-defaults属性是 是否注册成默认 ,不想设置为默认直接改成false即可 spring默认有一个StringConverter,我们又定义了一个,spring容器中就有了2个字符转换器, 运行时究竟会使用哪一个呢? ===> spring有默认规则,自定义的优先 --> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <!-- 指定构造参数 --> <constructor-arg index="0" value="UTF-8" /> </bean> <!--<bean class="com.taotao.manage.controller.CallbackMappingJackson2HttpMessageConverter"> <property name="callbackName" value="callback"></property> </bean>--> <bean class="com.baobao.common.spring.CallbackMappingJackson2HttpMessageConverter"> <property name="callbackName" value="callback"></property> </bean> </mvc:message-converters> </mvc:annotation-driven>
我们发现这里有一个类回调的配置类
public class CallbackMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter { // 做jsonp的支持的标识,在请求参数中加该参数 private String callbackName; @Override protected void writePrefix(JsonGenerator generator, Object object) throws IOException { String jsonpFunction = getJsonpFunction(); // 判断是否有callback if(StringUtils.isNotEmpty(jsonpFunction)){ generator.writeRaw(jsonpFunction + "("); } } @Override protected void writeSuffix(JsonGenerator generator, Object object) throws IOException { String jsonpFunction = getJsonpFunction(); // 判断是否有callback if(StringUtils.isNotEmpty(jsonpFunction)){ generator.writeRaw(");"); } } private String getJsonpFunction() { // 从threadLocal中获取当前的Request对象 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()) .getRequest(); String jsonpFunction = request.getParameter(callbackName); return jsonpFunction; } public String getCallbackName() { return callbackName; } public void setCallbackName(String callbackName) { this.callbackName = callbackName; } }
这样就完美解决跨域问题了
那么我们cros跨域呢?springboot里是怎么解决的呢,网关里面的配置类
@Configuration public class GlobalCorsConfig { @Bean public CorsFilter corsFilter() { //1.添加CORS配置信息 CorsConfiguration config = new CorsConfiguration(); //1) 允许的域,不要写*,否则cookie就无法使用了 config.addAllowedOrigin("http://manage.leyou.com"); config.addAllowedOrigin("http://www.leyou.com"); //2) 是否发送Cookie信息 config.setAllowCredentials(true); //3) 允许的请求方式 config.addAllowedMethod("OPTIONS"); config.addAllowedMethod("HEAD"); config.addAllowedMethod("GET"); config.addAllowedMethod("PUT"); config.addAllowedMethod("POST"); config.addAllowedMethod("DELETE"); config.addAllowedMethod("PATCH"); // 4)允许的头信息 config.addAllowedHeader("*"); //2.添加映射路径,我们拦截一切请求 UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); configSource.registerCorsConfiguration("/**", config); //3.返回新的CorsFilter. return new CorsFilter(configSource); } }