接着上篇文章 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. 物联网通信协议——比较-MQTT、 DDS、 AMQP、XMPP、 JMS、 REST、 CoAP

    物联网通信协议——比较-MQTT. DDS. AMQP.XMPP. JMS. REST. CoAP   AMQP & MQTT & DDS (https://www.youtube.c ...

  2. windows服务器详细安全设置

    1).系统安全基本设置 1.安装说明:系统全部NTFS格式化,重新安装系统(采用原版win2003),安装杀毒软件(Mcafee),并将杀毒软件更新,安装sp2补钉,安装IIS(只安装必须的组件),安 ...

  3. 阿里云Ubuntu部署java web - 文件夹

    文件夹(点击章节标题阅读): 阿里云Ubuntu部署java web(1) - 系统配置         ssh链接server(使用终端远程链接)        加入用户        给用户赋予运 ...

  4. Win7下更改iTunes备份路径最便捷的方法

    ① 先删除C:\Users\你的用户名\AppData\Roaming\Apple Computer里的 MobileSync文件夹(首次安装iTunes要先运行一次itunes,才有这个文件夹,如果 ...

  5. 转:微软分布式云计算框架Orleans

    http://www.cnblogs.com/ants/p/5122068.html 一种构建分布式. 高规模(伸缩)的应用程序 微软对奥尔良计划(Project Orleans)云计算框架开源.奥尔 ...

  6. Fiddler设置代理抓手机包

    启动Fiddler,打开菜单栏中的 Tools > Fiddler Options,打开“Fiddler Options”对话框. 在Fiddler Options”对话框切换到“Connect ...

  7. 理解、学习与使用Java中的Optional

    从Java8 引入的一个很有趣的特性是Optional类.Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异 ...

  8. Fatal error compiling: 无效的标记: -parameters

    [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ ...

  9. linux vi/vim文本编辑

    在linux环境下,我们用的最多的文本编辑命令就是vi了,vim是vi的增强版.学习vim时候整理了一下常用的命令行,一起学习. 介绍一下vim的三种常见状态模式: 命令模式,插入模式(编辑),正常模 ...

  10. CSDN日报20170217——《辞职信:写给我的“藤野先生”》

    [程序人生] 辞职信:写给我的"藤野先生" 作者:马伟青 对于离职的事情,我想由衷的对你说声抱歉! 我不是一个不懂得感恩的人,也不是一个不忠诚的人,更不是一个不热爱工作的人.不管提 ...