• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

微服务网关springcloud gateway自定义全局过滤器

武飞扬头像
程序猿(攻城狮)
帮助1

全局过滤器作为bean注册成功后,不需要进行配置,就可以直接生效。

全局过滤器的作用范围是对所有的请求。

  1.  
    package com.demo.gateway.filter;
  2.  
     
  3.  
    import java.net.InetAddress;
  4.  
    import java.net.UnknownHostException;
  5.  
    import java.util.List;
  6.  
     
  7.  
    import org.slf4j.Logger;
  8.  
    import org.slf4j.LoggerFactory;
  9.  
    import org.springframework.beans.factory.annotation.Autowired;
  10.  
    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
  11.  
    import org.springframework.cloud.gateway.filter.GlobalFilter;
  12.  
    import org.springframework.core.Ordered;
  13.  
    import org.springframework.core.io.buffer.DataBufferFactory;
  14.  
    import org.springframework.http.HttpCookie;
  15.  
    import org.springframework.http.HttpHeaders;
  16.  
    import org.springframework.http.HttpStatus;
  17.  
    import org.springframework.http.MediaType;
  18.  
    import org.springframework.http.server.reactive.ServerHttpRequest;
  19.  
    import org.springframework.http.server.reactive.ServerHttpResponse;
  20.  
    import org.springframework.stereotype.Component;
  21.  
    import org.springframework.util.MultiValueMap;
  22.  
    import org.springframework.web.server.ServerWebExchange;
  23.  
     
  24.  
    import com.alibaba.fastjson.JSON;
  25.  
    import com.ftsafe.common.utils.jwt.CheckResult;
  26.  
    import com.ftsafe.common.utils.jwt.JwtUtils;
  27.  
    import com.ftsafe.config.BlackListConfig;
  28.  
    import com.ftsafe.config.CacheConstants;
  29.  
    import com.ftsafe.config.IgnoreWhiteProperties;
  30.  
    import com.ftsafe.config.R;
  31.  
    import com.ftsafe.config.ServletUtils;
  32.  
    import com.ftsafe.config.StringUtils;
  33.  
     
  34.  
    import reactor.core.publisher.Mono;
  35.  
     
  36.  
    /**
  37.  
    * 网关鉴权
  38.  
    *
  39.  
    * @author ruoyi
  40.  
    */
  41.  
    @Component
  42.  
    public class AuthFilter implements GlobalFilter, Ordered
  43.  
    {
  44.  
    private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);
  45.  
     
  46.  
    // 多次反向代理后会有多个ip值 的分割符
  47.  
    private final static String IP_UTILS_FLAG = ",";
  48.  
    // 未知IP
  49.  
    private final static String UNKNOWN = "unknown";
  50.  
    // 本地 IP
  51.  
    private final static String LOCALHOST_IP = "0:0:0:0:0:0:0:1";
  52.  
    private final static String LOCALHOST_IP1 = "127.0.0.1";
  53.  
     
  54.  
    // 排除过滤的 uri 地址,nacos自行添加
  55.  
    @Autowired
  56.  
    private IgnoreWhiteProperties ignoreWhite;
  57.  
     
  58.  
    @Autowired
  59.  
    private BlackListConfig blackListConfig;
  60.  
     
  61.  
     
  62.  
    @Override
  63.  
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
  64.  
    {
  65.  
    ServerHttpRequest request = exchange.getRequest();
  66.  
    String url = request.getURI().getPath();
  67.  
     
  68.  
    String host = request.getURI().getHost();
  69.  
     
  70.  
    // 输出请求
  71.  
    HttpHeaders headers = request.getHeaders();
  72.  
    System.out.println("======header: " headers.toString());
  73.  
     
  74.  
    MultiValueMap<String, HttpCookie> cookies = request.getCookies();
  75.  
    System.out.println("======cookies: " cookies.toString());
  76.  
     
  77.  
    // 黑名单
  78.  
    List<String> blacklist = blackListConfig.getBlacklist();
  79.  
     
  80.  
    if(StringUtils.matches(url, blacklist))
  81.  
    {
  82.  
    return setUnauthorizedResponse(exchange, "禁止访问");
  83.  
    }
  84.  
     
  85.  
     
  86.  
    // 跳过不需要验证的路径
  87.  
    if (StringUtils.matches(url, ignoreWhite.getWhites()))
  88.  
    {
  89.  
    // 设置IP地址到文件请求头
  90.  
    if(StringUtils.isNotEmpty(clientIp))
  91.  
    {
  92.  
    ServerHttpRequest addRemoteIpReq = request.mutate().header(CacheConstants.REMOTE_IPADDR, clientIp)
  93.  
    .build();
  94.  
    ServerWebExchange mutableExchange = exchange.mutate().request(addRemoteIpReq).build();
  95.  
     
  96.  
    return chain.filter(mutableExchange);
  97.  
    }
  98.  
     
  99.  
    }
  100.  
     
  101.  
    String token = getToken(request);
  102.  
    if (StringUtils.isBlank(token))
  103.  
    {
  104.  
    return setUnauthorizedResponse(exchange, "令牌不能为空");
  105.  
    }
  106.  
     
  107.  
     
  108.  
    CheckResult validateJWT = JwtUtils.validateJWT(token);
  109.  
     
  110.  
    if(validateJWT != null && validateJWT.isSuccess() == false)
  111.  
    {
  112.  
    log.error("令牌验证失败");
  113.  
    log.info(validateJWT.toString());
  114.  
     
  115.  
    return setUnauthorizedResponse(exchange, "令牌验证失败");
  116.  
    }
  117.  
     
  118.  
     
  119.  
    String userid = "userid";
  120.  
    String username = "username";
  121.  
     
  122.  
    // 设置用户信息到请求
  123.  
    ServerHttpRequest mutableReq = request.mutate().header(CacheConstants.DETAILS_USER_ID, userid)
  124.  
    .header(CacheConstants.DETAILS_USERNAME, ServletUtils.urlEncode(username)).build();
  125.  
    ServerWebExchange mutableExchange = exchange.mutate().request(mutableReq).build();
  126.  
     
  127.  
    return chain.filter(mutableExchange);
  128.  
    }
  129.  
     
  130.  
    private Mono<Void> setUnauthorizedResponse(ServerWebExchange exchange, String msg)
  131.  
    {
  132.  
    ServerHttpResponse response = exchange.getResponse();
  133.  
    response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
  134.  
    response.setStatusCode(HttpStatus.OK);
  135.  
     
  136.  
    log.error("[鉴权异常处理]请求路径:{}", exchange.getRequest().getPath());
  137.  
     
  138.  
    return response.writeWith(Mono.fromSupplier(() -> {
  139.  
    DataBufferFactory bufferFactory = response.bufferFactory();
  140.  
    return bufferFactory.wrap(JSON.toJSONBytes(R.fail(msg)));
  141.  
    }));
  142.  
    }
  143.  
     
  144.  
     
  145.  
    /**
  146.  
    * 获取请求token
  147.  
    */
  148.  
    private String getToken(ServerHttpRequest request)
  149.  
    {
  150.  
    String token = request.getHeaders().getFirst(CacheConstants.HEADER);
  151.  
    if (StringUtils.isNotEmpty(token) && token.startsWith(CacheConstants.TOKEN_PREFIX))
  152.  
    {
  153.  
    token = token.replace(CacheConstants.TOKEN_PREFIX, "");
  154.  
    }
  155.  
    return token;
  156.  
    }
  157.  
     
  158.  
    @Override
  159.  
    public int getOrder()
  160.  
    {
  161.  
    return -200;
  162.  
    }
  163.  
     
  164.  
    }
学新通

全局过滤器,需要实现GlobalFilter接口,需要添加@Component注解。

利用全局过滤器,可以实现统一的鉴权处理,日志处理等。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggccbh
系列文章
更多 icon
同类精品
更多 icon
继续加载