一.使用场景
一般情况下,我们设计web系统都会分别设计前台和后台,前台供普通用户访问,给普通用户提供服务.然后后台给系统管理员使用,用于管理维护前台的数据,以及对一些环境的参数配置.对于后台管理一般都是只给公司内部的员工进行访问,所以我们一般要通过IP来限制访问,实现指定的人群才能够访问后台.
二.实现原理
- 把允许访问的IP地址,配置到properties文件里.
- 编写过滤器,在过滤器的init方法里读取保存IP白名单的properties文件,把配置的IP地址解析出来,存放到一个List集合中.
- 在过滤器的
doFilter()
方法内,获取访问用户的IP地址,然后将用户IP与List集合中的白名单IP列表逐个匹对,一旦有匹配就放行请求;如果都不匹配,则跳转到拒绝访问页面提示用户.
三.代码实现
- 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.*;
- 过滤器的编写
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<S