SpringCloud zuul网关常见问题解决办法

前言:今天整理一下以往的SpringCloud遇到一些常见的问题,顺手做一些笔记,记录一下自己遇到过的坑。

问题1:各服务之间请求的时候由于处于不同服务器或者不同ip的项目下,出现的跨域问题

问题2:各服务之间传递各种参数,但是通过request.setHeader传递参数,如token无法传递到下一个服务里的问题

             或者其他参数想近一步传递,但是到了网关这一步缺丢失了!

问题3:有一服务之间上传图片本地服务明明开启大容量size上限,却无法使用

 问题1处理办法

//加入一个springboot自项目启动跨域配置,

@Component
@Configuration
public class GateWaysCrosConfig {

    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");//允许跨域源
        config.addAllowedHeader("*");//允许的header参数
        config.addAllowedMethod("*");//允许的请求方式
        config.setMaxAge(18000L);
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

问题2 处理方法 估计这一个步骤遇到的人也比较多

//继承ZuulFilter的实现代码
@Component
public class TokenFilter extends ZuulFilter {

    @Autowired
    private AsopMangerFeign asopMangerFeign;
    /**
     * 过滤器类型:
     * pre 表示请求之前过滤
     */
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    /**
     * 过滤器执行顺序:
     * 当一个请求在同一个阶段存在多个过滤的时候,多个过滤器执行顺序
     */
    @Override
    public int filterOrder() {
        return FilterConstants.SEND_ERROR_FILTER_ORDER;
    }

    /**
     * 判断过滤器是否生效
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 编写过滤器拦截业务逻辑代码
     * 例如:TODO 校验登陆凭证
     */
    @Override
    public Object run() throws ZuulException {
        //获取上下文
        RequestContext currentContext = RequestContext.getCurrentContext();
       // currentContext.
        //获取request
        HttpServletRequest request = currentContext.getRequest();
        //获取token的时候,从请求头中获取
        HttpServletResponse response=currentContext.getResponse();
        //response.getHeader("");
        String userToken=String.valueOf(request.getParameter("credit"));
        if(userToken.equals("null")){
            userToken=request.getHeader("token");
        }
        String logicSysNo=String.valueOf(request.getParameter("logicSysNo"));
        if(logicSysNo.equals("null")){
            logicSysNo=request.getHeader("logicSysNo");
        }
        String signKey="vsvTM7nYHwhQZ5dsaazcz/szx";
        //singKey token的秘钥,这里我是做演示的,实际效果一样
        //userToken为jwt生成的token
        Claims claims= CheckUtil.resolveToken(signKey,userToken);
       
                //返回错误提示
                //不会继续执行...不会去调用服务接口,网关服务字节响应给客户端
                currentContext.setSendZuulResponse(false);
                currentContext.setResponseBody("验证失败");
                currentContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
                return false;
 
                //正常执行调用其它服务接口...
                return null;
    }
}
//非常关键的一步,上一级服务利用request传递到网关这里时,再传递到下一个服务时候,通过//request.getheaders获取出来为空的问题,在下面的代码进行处理
/**
 * 获取登录信息Utils
 *
 * @author hws
 * @since 2018/4/21 15:33
 */
public class CheckUtil {
    @Autowired
    private static HttpServletRequest request;

    /**
     * 解析凭证对象
     * @param token
     * @return
     */
    public  static Claims resolveToken(String signKey,String token){
        Claims claims = null;
        try {
            claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(token).getBody();
            return claims;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 配置用户request信息
     *ctx 网关的request上下文对象,jwt加密对象,logicSysNo系统编码
     * @return
     */
    public static boolean setUserMsg(RequestContext ctx , Claims claims, String logicSysNo) {
         // ctx.addZuulRequestHeader()可以把数据加入当前request headers对象里,进行对其他    //服务的参数保留作用
         ctx.addZuulRequestHeader("userId", claims.getId());
         ctx.addZuulRequestHeader("userName", 
         ctx.addZuulRequestHeader("orgId",String.valueOf(claims.get("orgId")) );
        return true;
    }
 


}
//YML文件里 zuul通过header传递参数时,防止重复header信息出现部分代码
zuul:
  #需要忽略的头部信息,不在传播到其他服务
  sensitive-headers: Access-Control-Allow-Origin
  ignored-headers: Access-Control-Allow-Origin,H-APP-Id,Token,APPToken

问题3 处理办法

//网关服务里,加个bean处理文件size过大的类
@Component
public class BaseConfig {

    /**
     * 文件上传配置
     */
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        // 单个文件最大  KB,MB
        factory.setMaxFileSize("10240KB");
        // 设置总上传数据总大小
        factory.setMaxRequestSize("102400KB");
        return factory.createMultipartConfig();
    }
}

 

你可能感兴趣的:(SpringCloud zuul网关常见问题解决办法)