接着上篇文章 https://www.cnblogs.com/mxmbk/p/9569438.html

IP访问限制和黑白名单如何做,需要解决以下几个问题

1、如何识别正常访问和异常访问?(一段时间同一接口访问次数太多?高峰期和低峰期是否不同?)

2、IP访问异常后拒绝策略是什么?(一段时间访问访问异常接口不能访问?高峰期和低峰期是否不同?)

3、是否不同业务的识别方法和拒绝策略不一样?(有些接口访问频率高,有些访问频率低?)

4、有些业务是否之后IP在白名单中才能访问?(只对第三方提供的接口?)

5、IP访问异常的通知?(请求被识别为异常是否通知到服务维护人员?)

先提出问题,在想解决方案,第一版的简单基于Spring cloud zuul的实现方案如下:

具体实现(基于ZuulFilter的实现):

  

 package com.brightcns.wuxi.citizencard.zuulserver.filter;

 import com.alibaba.fastjson.JSONObject;
import com.brightcns.wuxi.citizencard.common.feature.exception.SystemException;
import com.brightcns.wuxi.citizencard.common.feature.util.IPUtils;
import com.brightcns.wuxi.citizencard.common.feature.util.MD5Utils;
import com.brightcns.wuxi.citizencard.zuulserver.constants.properties.IPLimitProperty;
import com.brightcns.wuxi.citizencard.zuulserver.limit.AbstractIPLimitStrategy;
import com.brightcns.wuxi.citizencard.zuulserver.limit.IPLimitFactory;
import com.google.common.collect.Lists;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import static com.brightcns.wuxi.citizencard.order.constants.enums.ZuulErrorCode.IP_LIMIT; /**
* @author maxianming
* @date 2018/8/31 10:25
*/
@Slf4j
public class IPLimitFilter extends ZuulFilter {
// 白名单URI
private List<String> excludeUrl = Lists.newArrayList("/health","/info");
// 响应类型
public final String JSON_TYPE = "application/json;charset=UTF-8"; @Override
public String filterType() {
return FilterConstants.PRE_TYPE;
} @Override
public int filterOrder() {
return 0;
} @Override
public boolean shouldFilter() {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String requestUri = request.getRequestURI();
if (excludeUrl.contains(requestUri)) {
return false;
}
return true;
} @Override
public Object run() {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String requestIp = IPUtils.getIpAddress(request);
String requestUri = request.getRequestURI();
log.info("网关接受requestIp:[{}], requestUri:[{}]请求", requestIp, requestUri);
try {
AbstractIPLimitStrategy ipLimitStrategy = IPLimitFactory.getIPLimitStragy();
boolean result = ipLimitStrategy.isIPLimit(requestIp, requestUri);
if (result) {
log.info("requestIp:{},requestUri:{}访问限制", requestIp, requestUri);
context.setSendZuulResponse(false);
context.setResponseStatusCode(200);
context.setResponseBody(IP_LIMIT.getCode() + ":" + IP_LIMIT.getMsg());
context.getResponse().setContentType(JSON_TYPE);
}
} catch (Exception e) {
log.error("IP限制异常", e);
}
return null;
} }

 1、基于ZuulFilter的简单实现,ZuulFilter的使用可以自行百度,可参考 https://blog.csdn.net/dream_broken/article/details/77197585

 2、63-66行代码 主要是Filter不继续执行其他Filter,响应JSON给调用端

3、59行和60行重点主要采用了策略模式(黑天和白天不同策略)涉及敏感信息 只表明思路
     具体思路:

  • 采用redis incby 和 expire进行访问次数的统计和有效期的设置
  • redis key的生成规则: PREFIX:IP:MD5(uri)
  • 黑名单暂时配置文件中配置

 

Spring Cloud Zuul实现IP访问控制的更多相关文章

  1. Spring Cloud Zuul 限流详解(附源码)(转)

    在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. ...

  2. spring cloud: zuul: 微网关-简单使用与路由配置

    spring cloud: zuul: 微网关-简单使用与路由配置 首先引入依赖 <dependency> <groupId>org.springframework.cloud ...

  3. Spring Cloud(十二):Spring Cloud Zuul 限流详解(附源码)(转)

    前面已经介绍了很多zuul的功能,本篇继续介绍它的另一大功能.在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选 ...

  4. Spring Cloud Zuul 概览

    什么是API网关 网关这个词其实是一个硬件概念.因为按照定义,网络网关出现在网络的边缘,所以防火墙和代理服务器等相关功能 往往与之集成在一起.在家庭网络 和小型企业中,宽带路由器通常充当网络网关.它将 ...

  5. Spring Cloud Zuul 添加 ZuulFilter

    紧接着上篇随笔Spring Cloud Zuul写,添加过滤器,进行权限验证 1.添加过滤器 package com.dzpykj.filter; import java.io.IOException ...

  6. Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。

    时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...

  7. 笔记:Spring Cloud Zuul 快速入门

    Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了 ...

  8. Spring Cloud Zuul 中文文件上传乱码

    原文地址:https://segmentfault.com/a/1190000011650034 1 描述 使用Spring Cloud Zuul进行路由转发时候吗,文件上传会造成中文乱码“?”.1. ...

  9. spring cloud zuul参数调优

    zuul 内置参数 zuul.host.maxTotalConnections 适用于ApacheHttpClient,如果是okhttp无效.每个服务的http客户端连接池最大连接,默认是200. ...

随机推荐

  1. WCF公开服务元数据方式

    一般我们使用了scvutil命令自动生成了服务的客户端代理类: 例如:svcutil http://localhost:8000/?wsdl /o:FirstServiceClient.cs 命令中h ...

  2. 解决Win10系统下 C# DateTime 出现星期几的问题 解决ASP.NET MVC 接受Request Playload参数问题

    解决Win10系统下 C# DateTime 出现星期几的问题 昨天晚上写代码的时候偶然发现 DateTime 里出现了星期几,当时一阵凌乱,去网上百度没有详细解决办法,很多人说可以用用 ToStri ...

  3. Yii Framework2.0开发教程(3)数据库mysql入门

    沿用教程(2)的代码 第一步.在本地mysql数据库中新建数据库zhyoulun 第二步.在数据库中新建表并插入若干条数据 CREATE TABLE `country` ( `code` CHAR(2 ...

  4. Atitit.swt 线程调用ui控件的方法

    Atitit.swt 线程调用ui控件的方法 1 SwingUtilities.invokeLater1 2 display.asyncExec方法1 3  display.timerExec(500 ...

  5. ToStringBuilder学习(二):两种方法用法优缺点及一个问题

    研究ApacheCommon源码, 先从一个最简单的开始,即围绕Object类里的toString方法自动化实现的一系列类.         怎么来自动化地实现toString方法, 有两种:反射和手 ...

  6. jdk8 StreamApi

    List<User> userList=new ArrayList<>(); userList.add(User.builder().age().name()).build() ...

  7. (译)Getting Started——1.2.1 Defining the Concept(确定理念)

    每个出色的应用都是由理念开始的.在开发应用时,你不需要把理念完善和完成后再进行开发.但是你确实需要确定你要做什么,做完后的效果如何. 为了定义理念,问自己以下的问题: 应用的受众是哪些人?应用的内容和 ...

  8. swfupload 上传报 security error # 2049 (security) 安全错误问题

    老外给出类似理由: 大致是说这个是flash播放器自身组件安全策略问题, 禁止跨域上传的. I believe this is due to the Flash Player's "same ...

  9. 换个角度剖析iptables防火墙

    这篇文章会尽量以通俗易懂的方式描述iptables的相关概念,请耐心的读完它. 防火墙相关概念 此处先描述一些相关概念. 从逻辑上讲.防火墙可以大体分为主机防火墙和网络防火墙. 主机防火墙:针对于单个 ...

  10. Tuning 05 Sizing other SGA Structure

    Redo Log Buffer Content The Oracle server processes copy redo entries from the user’s memory space t ...