基于java过滤器实现web系统的IP访问控制

springboot过滤器禁止ip频繁访问 1.编写一个过滤器:  package com.solian.web.filter; import java.io.IOException; import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.servlet.Filter; import javax.servlet.Filt... 阅读详情
一.使用场景 
  一般情况下,我们设计web系统都会分别设计前台和后台,前台供普通用户访问,给普通用户提供服务.然后后台给系统管理员使用,用于管理维护前台的数据,以及对一些环境的参数配置.对于后台管理一般都是只给公司内部的员工进行访问,所以我们一般要通过IP来限制访问,实现指定的人群才能够访问后台. 
二.实现原理 
1. 把允许访问的IP地址,配置到properties文件里. 
2. 编写过滤器,在过滤器的init方法里读取保存IP白名单的properties文件,把配置的IP地址解析出来,存放到一个List集合中. 
3. 在过滤器的doFilter()方法内,获取访问用户的IP地址,然后将用户IP与List集合中的白名单IP列表逐个匹对,一旦有匹配就放行请求;如果都不匹配,则跳转到拒绝访问页面提示用户. 
三.代码实现 
1. IP白名单的配置 
 一般我们要提供三种配置IP白名单的方式 
 1). 单个IP地址的配置,多个之间用逗号或分好隔开 
 2). IP地址区间方式的配置,多个区间用逗号或分好隔开,如192.168.1.0-192.168.1.10;192.168.1.20-192.168.1.50 
 3). 通配符,多个用逗号或分好隔开,如192.168.0.* 
示例如下: 
#单个IP地址的配置,多个之间用逗号或分好隔开 
allowIP=192.168.0.105;192.168.0.108;127.0.0.1 

#IP地址区间方式的配置,多个区间用逗号或分好隔开 
allowIPRange=192.168.0.10-192.168.0.20;192.168.0.100-192.168.0.110 

#通配符,多个用逗号或分好隔开 
allowIPWildcard=192.168.0.*; 
1. 过滤器的编写 
package com.legendshop.filter; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Properties; 
import java.util.regex.Pattern; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import com.legendshop.exception.IPAccessException; 
import com.legendshop.exception.IPFormatException; 

public class IPFilter implements Filter { 
//用来存放初始化后的IP白名单列表对应的正则表达式 
private List<String> allowRegexList = new ArrayList<String>(); 

@Override 
public void init(FilterConfig config) throws ServletException { 
try { 
//在过滤器初始化的时候初始化白名单列表 
initAllowList(); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
} 

public void initAllowList() throws IOException{ 
//读取配置文件,并加载到Properties集合中 
InputStream inStream = new FileInputStream("ipFilter.properties"); 
Properties prop = new Properties(); 
prop.load(inStream); 

//分别获取三种配置方式配置的IP 
String allowIP = prop.getProperty("allowIP"); 
String allowIPRange = prop.getProperty("allowIPRange"); 
String allowIPWildcard = prop.getProperty("allowIPWildcard"); 

//对用户配置的三种方式的IP白名单进行格式校验 
if(!validate(allowIP, allowIPRange, allowIPWildcard)){ 
throw new RuntimeException("IP白名单格式定义异常!"); 
} 

//将第一种方式配置的ip地址解析出来,添加到存放IP白名单集合 
if(null != allowIP && !allowIP.trim().equals("")){ 
String[] address = allowIP.split(",|;"); 

if(null != address && address.length > 0){ 
for(String ip : address){ 
allowRegexList.add(ip); 
} 
} 
} 

//将第二种方式配置的ip地址解析出来,添加到存放IP白名单集合 
if(null != allowIPRange && !allowIPRange.trim().equals("")){ 
String[] addressRanges = allowIPRange.split(",|;"); 

if(null != addressRanges && addressRanges.length > 0){ 
for(String addrRange : addressRanges){ 
String[] addrParts = addrRange.split("-"); 

if(null != addrParts && addrParts.length >0 && addrParts.length <= 2){ 
String from = addrParts[0]; 
String to = addrParts[1]; 
String prefix = from.substring(0, from.lastIndexOf(".")+1); 

int start = Integer.parseInt(from.substring(from.lastIndexOf(".")+1,from.length())); 
int end = Integer.parseInt(to.substring(to.lastIndexOf(".")+1,to.length())); 

for(int i = start;i <= end;i++){ 
allowRegexList.add(prefix+i); 
} 

}else{ 
throw new RuntimeException("IP列表格式定义异常!"); 
} 
} 
} 
} 

//将第三种方式配置的ip地址解析为一条一条的正则表达式,添加到存放IP白名单集合,如对此处不明白可以先看后面的备注 
if(null != allowIPWildcard && !allowIPWildcard.trim().equals("")){ 
String[] address = allowIPWildcard.split(",|;"); 

if(null != address && address.length > 0){ 
for(String addr : address){ 
if(addr.indexOf("*") != -1){ 
//将*,替换成匹配单端ip地址的正则表达式 
addr = addr.replaceAll("\\*", "(1\\\\d{1,2}|2[0-4]\\\\d|25[0-5]|\\\\d{1,2})"); 
addr = addr.replaceAll("\\.", "\\\\.");//对.进行转义 
allowRegexList.add(addr); 
}else{ 
throw new RuntimeException("IP白名单格式定义异常!"); 
} 
} 
} 
} 
} 

public boolean validate(String allowIP,String allowIPRange,String allowIPWildcard){ 

//匹配IP地址每一段的正则 
String regx = "(1\\d{1,2}|2[0-4]\\d|25[0-5]|\\d{1,2})"; 
//把四段用点连接起来,那就是匹配整个ip地址的表达式 
String ipRegx = regx + "\\." + regx + "\\."+ regx + "\\." + regx; 

//校验第一种配置方式配置的IP白名单格式是否正确 
Pattern pattern = Pattern.compile("("+ipRegx+")|("+ipRegx+"(,|;))*"); 
if(!this.validate(allowIP, pattern)){ 
return false; 
} 

//校验第二种配置方式配置的的IP白名单格式是否正确 
pattern = Pattern.compile("("+ipRegx+")\\-("+ipRegx+")|"+ "(("+ipRegx+")\\-("+ipRegx+")(,|;))*"); 
if(!this.validate(allowIPRange, pattern)){ 
return false; 
} 

//校验第三种配置方式配置的的IP白名单格式是否正确 
pattern = Pattern.compile("("+regx+"\\."+ regx+"\\."+regx+"\\."+ "\\*)|"+"("+regx+"\\."+regx+"\\."+regx+"\\."+ "\\*(,|;))*"); 
if(!this.validate(allowIPWildcard, pattern)){ 
return false; 
} 
return true; 
} 

//校验用户配置的ip列表格式是否正确 
public boolean validate(String allowIP,Pattern pattern){ 
//如果为空则不做处理 
if(null != allowIP && !allowIP.trim().equals("")){ 
StringBuilder sb = new StringBuilder(allowIP); 

//如果用户配置的IP配置了多个,但没有以分号结尾,这里就给它加上分号 
if(!allowIP.endsWith(";")){ 
sb.append(";"); 
} 
//如果不匹配 
if(!pattern.matcher(sb).matches()){ 
return false; 
} 
} 
return true; 
} 

@Override 
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) 
throws IOException, ServletException { 
HttpServletRequest request = (HttpServletRequest) req; 
HttpServletResponse response = (HttpServletResponse) resp; 

//1.获取访问者的IP地址 
String remoteAddr = request.getRemoteAddr(); 

if(null == remoteAddr || remoteAddr.trim().equals("")){ 
throw new RuntimeException("IP地址为空,拒绝访问!"); 
} 

//如果白名单为空,则认为没做限制,放行 
if(null == allowRegexList || allowRegexList.size() == 0){ 
filterChain.doFilter(request, response); 
return; 
} 

//检查用户IP是否在白名单 
if(checkIp(remoteAddr)){ 
filterChain.doFilter(request, response); 
return; 
}else{ 
throw new RuntimeException("您的IP:"+remoteAddr+",不在白名单中,拒绝访问!"); 
} 
} 

//检查用户IP是否在白名单 
public boolean checkIp(String remoteAddr){ 
for(String regex : allowRegexList){ 
if(remoteAddr.matches(regex)){ 
return true; 
} 
} 
return false; 
} 

@Override 
public void destroy() { 

} 
} 

更多信息,请关注http://www.legendshop.cn 
三.备注 
  本文比较不好理解的就是对第三种IP配置方式的解析,我的程序是把第三中配置的IP白名单解析为正则表达式的,比如用户配置的是192.168.1.,我并不是把它解析为192.168.1.0到192.168.1.255的256个IP地址,然后放到List集合中,而是吧192.168.1.解析为一条正则表达式192.168.1.(1\d{1,2}|2[0-4]\d|25[0-5]|\d{1,2}) 这条正则表达式可以匹配192.168.1.0到192.168.1.255的256个IP地址,这样就大大减少了程序循环的次数,提高了程序的性能.但由于我这里存放的是正则,所以我干脆就把我前面定义的那个存放白名单的List集合理解为,它里面存放的每一条都是正则,匹配白名单的正则.无论他是一个IP地址,如192.168.1.1我也当它是正则.所以我上面是这样校验用户IP是否在白名单中: 

//检查用户IP是否在白名单 public boolean checkIp(String remoteAddr){ //把白名单列表中的每一条都当成正则来匹配 for(String regex : allowRegexList){ if(remoteAddr.matches(regex)){ return true; } } return false; } 

原文链接:http://www.bijishequ.com/detail/410522?p=


冷源法测试噪声系数(Noise Figure)详细步骤 背景知识 电阻负载的功率谱密度 噪声等效模型 3 4 冷源法测试步骤 注意事项 阅读详情

相关推荐

ESP8266 进行HDLC解码,AX.25,APRS

/************************************************************** 函数名:aprs_wait_begin() 参 数:无 返回值:bool true=得到合法脉冲,false=未得到 说 明:等待第1个833us高脉冲,判断范围 730-930,其他忽略 ***************************************************************/ bool aprs_wait_begin(){ stati

蓝蓝的博客 1634

Web开发 : Filter获取用户ip地址和网页uri信息并存入mysql数据库

来自没有经验的暴戾武士其实标题是这个:Filter获取用户ip地址和网页uri入口并存入mysql数据库mysql数据库准备java构建实体LogService连接数据库/新增日志Filter调用新增访问方法获取相应信息最终效果图考虑到废话写在前面太丑陋且可能吓走一堆人,所以这次写在后面 其实标题是这个:Filter获取用户ip地址和网页uri入口并存入mysql数据库 好像有点长的样子 话不多说???? mysql数据库准备 首先要现在mysql数据库里面创建一张表用来放上述的信息,表里面要有序列号、ip

陈杉菜 1583

Pico设备手势追踪实战:5步搞定MRTK3手部模型与UI交互配置

本文详细介绍了在Pico设备上使用MRTK3实现手势追踪的5个关键步骤,包括环境配置、手部模型冲突解决、射线交互优化、UI交互配置及性能优化。通过实战案例和代码示例,帮助开发者快速解决MR开发中的常见问题,提升混合现实应用的交互体验。

onion的博客 499

服务端获得客户端ip

/** * 获取客户端ip地址(可以穿透代理) * * @param request * @return */ public static String getRemoteAddr(HttpServletRequest request) { String ip = request.getHead...

aojuan7118的博客 487

平衡电桥在高压绝缘检测中的动态切换策略与误差优化

本文深入探讨了平衡电桥在高压绝缘检测中的动态切换策略与误差优化方法。通过分析四种基本切换模式及智能切换时序设计,显著提升检测精度与范围。结合电阻选型黄金法则和软件补偿技术,有效降低测量误差,为电动汽车电池管理系统提供可靠的安全保障。

weixin_30275415的博客 473

新手必看:TwinCAT死活扫不到倍福CX5020?别慌,先检查这3个地方(附静态IP配置)

本文详细介绍了TwinCAT软件无法扫描到倍福CX5020控制器的常见问题及解决方案。从网络连通性检查、系统环境配置到静态IP设置,提供了一套完整的排查流程和优化建议,帮助新手快速解决通信问题,确保设备稳定运行。

weixin_27219587的博客 367

request请求中通过过滤获取准确IP地址

/** * @Title: I6000 Ip地址过滤器 * @Description: I6000 访问服务端进行的ip地址过滤 * @Copyright: Copyright (c) 2018 * @Company:北京易联通达有限公司 * * @author hyn * @version 1.0 */ @Service public class WebserviceFilte...

北京Java青年 2770

别再只会插拔了!深入Linux内核,手把手调试USB热插拔中断(以高通平台为例)

本文深入探讨了Linux内核中USB热插拔中断的调试方法,特别针对高通平台提供了详细的实战指南。从硬件基础到内核机制,再到中断调试工具和常见问题排查,帮助开发者系统性地解决USB设备识别问题。通过监控中断状态、分析处理流程和高级调试技巧,提升USB热插拔的稳定性和性能。

weixin_29161785的博客 429

java 拦截器 获取ip_使用拦截器获取用户真实IP地址

@Log4j2public class MyInterceptor extends HandlerInterceptorAdapter {private static final String USER_AGENT = "user-agent";/*** 重写前置拦截器* @param request* @param response* @param handler* @return* @thro...

weixin_39604189的博客 1374

第29章:PCL PrincipalCurvatures 曲率估计

PrincipalCurvatures(主曲率估计)是一种用于计算点云表面曲率的算法。曲率描述了曲面局部的弯曲程度,是表面几何特征的重要指标。在点云处理中,估计表面的曲率对于形状分析、物体识别、表面重建等任务非常重要。主曲率是曲面上某一点的最大和最小曲率方向。通过计算点云的主曲率,我们可以获得点云中每个点的局部形状特征。通常情况下,主曲率包括两个主要参数:最大主曲率(最大曲率方向上的曲率)和最小主曲率(最小曲率方向上的曲率)。优点缺点提供了对点云表面局部形状的深入分析。

yumeiguo的博客 213

杰理-tone

低音质格式切换高音质格式:切换提示音格式,未导出,编译下载没有提示音;提示音导出,再次编译下载,提示音正常高音质格式切换低音质格式:不需要导出,直接编译下载,提示音正常。

m0_67447112的博客 955

Java Web项目通过filter限制IP访问及路由拦截

背景 web开发中出于安全方面的考虑,对于后台管理项目通常会对用户访问做限制,常见的做法是硬件上设置白名单,过滤掉不需要的IP访问来保证管理平台的安全。但是在硬件操作不方便的情形之下,就需要开发人员通过程序对访问的IP进行限制,具体的实现方式可能会受到实际环境的影响而稍有不同,本文针对直接部署...

chunfupang6336的博客 2693

从点云到舱口尺寸:船甲板舱口检测的算法实现

本文提出了一种从船甲板激光扫描点云中自动检测舱口尺寸的算法。通过数据预处理(降采样、去噪、平面分割)后,采用甲板投影轮廓法将3D点云转换为2D图像,利用双次闭运算解决扫描碎片化问题,通过轮廓树检测内轮廓识别舱口。算法最终能稳定检测出三个主要舱口的长宽尺寸、面积和位置信息,矩形度超过0.89。该方法克服了扫描稀疏和围壁结构复杂的问题,参数可调性强,适用于工程实践。关键创新点在于将舱口识别转化为图像中的"洞"检测,而非直接处理3D几何特征。

点云兔子的博客 147

Shiro - 实现 Shiro 接口限流 结合过滤器实现访问控制

通过本文,我们成功实现了基于 Apache Shiro 的接口限流机制无缝集成:利用 Shiro 过滤器链,无需修改业务代码。灵活配置:支持按 IP、用户、URI 多维度限流。分布式支持:基于 Redis,适用于集群环境。标准响应:返回 429 状态码,符合 RESTful 规范。支持动态配置热更新(如通过 Apollo、Nacos)。集成实现可视化监控。引入机器学习动态调整限流阈值。安全与稳定是系统长期运行的基石。Shiro 提供了强大的访问控制能力,而限流则是其不可或缺的补充。

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IP黑白名单:Spring Boot访问控制列表实现终极指南

在当今网络安全威胁日益严峻的环境下,IP黑白名单访问控制列表已成为保护Web应用的第一道防线。Spring Boot作为Java开发的主流框架,提供了强大的安全机制来实现IP地址过滤功能。本文将为你详细解析如何在Spring Boot项目中配置IP黑白名单访问控制列表,让你的应用安全性更上一层楼!🚀 ## 什么是IP黑白名单访问控制列表? IP黑白名单访问控制列表是一种基于网络层地址的访问控

gitblog_00355的博客 394

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java拦截器(Interceptor)和过滤器(Filter)实例详解

过滤器和拦截器的区别,以及使用代码使用案例。

帅帅气气的黑猫警长 8048

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Servlet过滤器机制分析及应用(二)

2  应用实例  从上面分析可知,实现Servlet过滤器,需要两步:第一步开发过滤器,设计一个实现Filter接口的类;第二步通过web.xml配置过滤器,实现过滤器和Servlet、jsp页面之间的映射。  以下设计一个简单的IP地址过滤器,根据用户的IP地址进行对网站的访问控制。  (1) 过滤器类的设计 ipfilter.java  package ipf;      

machy123的专栏 2024

过滤器-禁止未授权的IP访问站点

使用过滤器禁止未授权的IP访问站点是过滤器的常见应用之一。原理是将要禁止的IP地址在web.xml中配置,过滤器中用init()方法获取web.xml中禁止的IP地址,将该值保存到过滤器的属性中,供doFilter()使用。示例1.创建一个IP过滤的Filter类FilterIP.javapackage filter;import java.io.IOException;import javax.s

i_belive_my_love的博客 1106

Java Web如何限制访问的IP的两种方法

Java Web限制IP访问的两种方法   前一阵子因为在做项目时碰到了这个功能,现在好好总结一下,至于为什么要限制IP访问,我就不多说了。然后百度了一下,现在主要有两种方式去限制IP访问,第一种是最简单的方便的,第二种是通过过滤器来限制访问。下面我简单介绍一下第一种方式,着重介绍第二种。 第一种方式(Tomcat配置项配置允许或限制IP访问)   这种是最简单的快捷的,主要就涉及Tomca...

写Bug的小白的博客 2万+

简单的IP地址过滤器

有些时候我们会对某些访客并不欢迎!为了不让他们进入系统,这时候就可以用过滤器进行限制.原理是当一个不受欢迎的用户发出访问请求时,首先进入过滤器进行判断他的IP是否在"黑名单",如是,就拒之墙外!下面贴上这个简单的过滤器代码:文件名:IPFilter.java package servlets;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.Filter;import javax.servlet.Filter

1719

SpringBoot实现IP黑白名单:从拦截器到网关的Web应用访问控制实战

访问控制是Web应用安全的基础,其核心原理是通过预定义的规则对请求进行过滤与放行。在技术实现上,基于网络层标识(如IP地址)的访问控制因其简单高效,成为构建安全防线的常见手段。其技术价值在于,它能有效拦截恶意流量、限制非授权访问,为应用提供第一层防护。典型的应用场景包括防止恶意爬虫、抵御暴力破解以及限制特定区域访问。本文聚焦于如何在SpringBoot框架中实现IP黑白名单功能,深入探讨了通过Spring MVC拦截器、Servlet过滤器以及集成API网关等多种方案来构建这一基础安全机制,并详细解析了获取

weixin_34221775的博客 769

限制内网(指定ip段)访问某页面的方法——过滤器

web.xml:(可配置多个jsp) &lt;filter&gt; &lt;filter-name&gt;accessFilter&lt;/filter-name&gt; &lt;filter-class&gt;com.facebook.util.AccessFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-map...

透明大脑 5937

java filter ip_java web项目 IP控制 filter配置实例

最近工作需要做一个IP控制功能,项目有两个登陆页面,分为前台后台登陆页面。后台登陆页面,不要暴露给普通用户,需要进行IP控制。1.web.xml 配置filterxmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http...

weixin_39653733的博客 157

java实现ip能访问_java 实现IP访问量控制

同一个IP 访问网站, 不能同时超过配置的最大值, 可以用来保护REST IP 或者DOS攻击/** Pprun's Public Domain.*/package mon.security;import java.io.IOException;import java.util.Collections;import java.util.HashMap;import java.util.HashSe...

weixin_28702105的博客 249

Servlet过滤器——禁止未授权的IP访问站点

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

kt1776133839的博客 753
上一篇: 微信群发图文消息步骤说明
下一篇: CentOS 6.8 安装RabbitMQ提示ERROR: epmd error for host "77": badarg (unknown POSIX error)
dw_java08
博客等级 码龄15年 122粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值