Spring Cloud Zuul实现IP访问控制
接着上篇文章 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访问控制的更多相关文章
- Spring Cloud Zuul 限流详解(附源码)(转)
在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. ...
- spring cloud: zuul: 微网关-简单使用与路由配置
spring cloud: zuul: 微网关-简单使用与路由配置 首先引入依赖 <dependency> <groupId>org.springframework.cloud ...
- Spring Cloud(十二):Spring Cloud Zuul 限流详解(附源码)(转)
前面已经介绍了很多zuul的功能,本篇继续介绍它的另一大功能.在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选 ...
- Spring Cloud Zuul 概览
什么是API网关 网关这个词其实是一个硬件概念.因为按照定义,网络网关出现在网络的边缘,所以防火墙和代理服务器等相关功能 往往与之集成在一起.在家庭网络 和小型企业中,宽带路由器通常充当网络网关.它将 ...
- Spring Cloud Zuul 添加 ZuulFilter
紧接着上篇随笔Spring Cloud Zuul写,添加过滤器,进行权限验证 1.添加过滤器 package com.dzpykj.filter; import java.io.IOException ...
- Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。
时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...
- 笔记:Spring Cloud Zuul 快速入门
Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了 ...
- Spring Cloud Zuul 中文文件上传乱码
原文地址:https://segmentfault.com/a/1190000011650034 1 描述 使用Spring Cloud Zuul进行路由转发时候吗,文件上传会造成中文乱码“?”.1. ...
- spring cloud zuul参数调优
zuul 内置参数 zuul.host.maxTotalConnections 适用于ApacheHttpClient,如果是okhttp无效.每个服务的http客户端连接池最大连接,默认是200. ...
随机推荐
- 采集音频和摄像头视频并实时H264编码及AAC编码
转自:http://www.cnblogs.com/haibindev/archive/2011/11/10/2244442.html 0. 前言 我在前两篇文章中写了DirectShow捕获音视频然 ...
- ehcache object key的实现原理
这几天为了设计缓存机制,查阅了非常多缓存方面的资料,作为没有实战经验的小白自然被各种性能报告.内存机制.集群方式搞得一头雾水. 但查了这些资料后.对各个cache的特点有了感性的了解. ehcache ...
- mysql-ubuntu14.04彻底卸载mysql
删除mysql的数据文件 sudo rm /var/lib/mysql/ -R 删除mysql的配置文件 sudo rm /etc/mysql/ -R 自动卸载mysql(包括server和clien ...
- memcache操作实例
实例一: <?php //使用memcache类来操作 $mm = new Memcache(); $mm->addServer("192.168.70.114",11 ...
- flink on yarn部分源码解析
转发请注明原创地址:https://www.cnblogs.com/dongxiao-yang/p/9403427.html flink任务的deploy形式有很多种选择,常见的有standalone ...
- makefile之shell函数
shell函数不同于除"wildcard"函数之外的其它函数.make可以使用它来和外部通信. 函数功能:函数"shell"所实现的功能和shell中的引用(` ...
- Javascript网页截屏的方法
最近我在研究开发一个火狐插件,具体的功能是将网页内容截屏并分享到微博上.目前基本功能已经实现,大家可以在 @程序师视野 里看到用这个截图插件分享的微博的效果. 之前我曾写过如何将canvas图形转换成 ...
- 使用Django框架
1.安装Django 在命令行模式下使用pip工具来安装Django,pip工具的安装方法见此篇 pip install django 2.确认是否安装成功 在Python交互模式下 import d ...
- hdu 1042 N! java大数及判断文件末尾
N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submi ...
- PHP文件包含
今天突然发现这个东西有好多奇怪的东西,特别写一下记一下 测试用的1.txt及phpinfo.php内容都是phpinfo() 截断: 好多.和好多./截断:这里不测试了,摘自代码审计一书,5.2可用, ...