Jsonp跨域解决如何配置

首先我们在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);
    }
}

猜你喜欢

转载自blog.csdn.net/qpc672456416/article/details/80828407