跨域问题处理

下面仅针对有容器应用可能遇到的几种跨域问题做一下简单的可参考的解决方案(仅供参考、务必完全测试后再上线提供服务)。

假设当前有容器应用的域名是 hello.isv.youzan.com

假设应用内提供了一个 http 接口 https://hello.isv.youzan.com/buyer/coupon

假设应用提供了一个前端界面给商家使用 https://hello.isv.youzan.com/business/coupon

第一种跨域情况

在 h5.youzan.com 等其他页面因定制需求,需向 https://hello.isv.youzan.com/buyer/coupon 获取一些信息,此时涉及到跨域请求。

Java 应用

可通过下面代码来解决这个问题

@Configuration
public class CorsConfig {    
  @Bean    
  public CorsFilter corsFilter() {        
    final UrlBasedCorsConfigurationSource configurationSource= new UrlBasedCorsConfigurationSource();        
    final CorsConfiguration corsConfiguration = new CorsConfiguration();        
    corsConfiguration.setAllowCredentials(true);        
    corsConfiguration.addAllowedOrigin("*");        
    corsConfiguration.addAllowedHeader("*");        
    corsConfiguration.addAllowedMethod("*");        
    configurationSource.registerCorsConfiguration("/**", corsConfiguration);        
    return new CorsFilter(configurationSource);    
  }
} 

PHP 应用

可参考下面一些方案,此处不再给出具体代码。

参考 Slim 官方对跨域的解决方案: http://www.slimframework.com/docs/v3/cookbook/enable-cors.html

开源爱好者的一种解决方案:https://appelsiini.net/projects/cors-middleware/

第二种跨域情况

在 hello.isv.youzan.com 的前端界面下,请求非本域的服务,例如 https://open.youzanyun.com/

首先,不建议由前端直接调用有赞云开放接口,因为有安全隐患(accesstoken 的泄漏)

对于这种跨域情况,应由同域的后端服务来包装或反向代理。