项目采用Spring cloud微服务框架,使用ZUUL作为路由服务,在使用过程中遇到了如下问题,记录下来供大家借鉴。
1、关于跨域
API需要提供给其他项目使用,由于服务通过zuul,所以zuul需要支持跨域访问。
解决办法:
增加跨域过滤器即可1
2
3
4
5
6
7
8
9
10
11
12
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        config.setMaxAge(3600L);
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
2、文件上传中文名乱码
使用form上传文件,直接post到服务,文件名中文读取正常。但是通过zuul中转后,文件名变成乱码。
解决办法:
1、注意编码,全站api和前端全部要使用utf-8编码。zuul中强制编码为utf-8,参数配置如下:1
2
3
4
5
6spring:
  http:
    encoding:
      charset: UTF-8
      enabled: true
      force: true
2、修改nginx路由设置,在原来的api地址前,统一增加zuul。因为默认上传文件是通过服务自己的controller来处理,增加zuul前缀后,通过zuul servlet来处理,避免了多次跳转,和引入编码错误。nginx配置举例:1
2
3
4
5
6
7
8
9
10
11
12location /api/ {
            proxy_pass   http://localhost:9999/zuul/api/;
            proxy_redirect  http://localhost:9999/zuul/api/ /api/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
            client_max_body_size 500m;
            proxy_connect_timeout 60s;
            proxy_read_timeout 600s;
            proxy_send_timeout 600s;
        }
3、增加zuul前缀后会导致header中出现Access-Control-Allow-Credentials等属性重复的异常,需要在zuul中设置header忽略。参数配置如下1
2
3zuul:
  sensitiveHeaders: Authorization
  ignored-headers: Access-Control-Allow-Credentials,Access-Control-Allow-Origin,Vary,X-Frame-Options