具备白名单、黑名单的Filter基类扩展
问题引入:
比如定义了一个mapping,
<servlet-mapping> <servlet-name>html_dispatcher</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping>
就是说所有的.html请求都会由html_dispatcher来处理,但现在的问题是:
我希望某个文件夹下面的.html不用这个html_dispatcher处理,而所有其它的.html请求不变。因为把所有其它的.html列出来实在太多了,多到我都不知道有多少。所以不能一一列出。
很明显,可以使用在白名单里排除一部分黑名单来实现。
大家在开发Java Web时,在使用过滤器时是比较挠头的,比如
<filter-mapping><filter-name>TestFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
url-pattern只能是如下三种:
1、前缀匹配 /user/*
2、后缀匹配 *.do
3、绝对匹配 /myservlet
而且如果我想过滤多个url必须
<filter-mapping><filter-name>TestFilter</filter-name><url-pattern>/a</url-pattern></filter-mapping><filter-mapping><filter-name>TestFilter</filter-name><url-pattern>/b</url-pattern></filter-mapping>
两个问题:
1、有的朋友可能需要过滤*.html 但要排除一部分(黑名单);
2、有的朋友可能需要过滤多个url,如/a /b,对于每一个url必须写一个filter-mapping比较繁琐;
因此我写了一个非常简单的具备白名单和黑名单功能的基类Filter,过滤url使用Ant Path:
package com.sishuok.web.filter;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
/*** * 配置方式<filter><filter-name>TestFilter</filter-name><filter-class>com.sishuok.web.filter.TestFilter</filter-class><!-- url分隔符可以是 换行 空格 分号 逗号 白名单和黑名单都是可选--><init-param><param-name>blackListURL</param-name> <!-- 配置黑名单url 表示不走过滤器的url order:1 --><param-value>/aa/bb/**/cc/*</param-value></init-param><init-param><param-name>whiteListURL</param-name> <!-- 配置白名单url 表示走过滤器的url order:2--><param-value>/dd;/ee,/ff /list</param-value></init-param></filter><filter-mapping><filter-name>TestFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>* * @author Zhang Kaitao**/
public abstract class BaseFilter implements Filter {private FilterConfig config = null;private final String[] NULL_STRING_ARRAY = new String[0];private final String URL_SPLIT_PATTERN = "[, ;\r\n]";//逗号 空格 分号 换行private final PathMatcher pathMatcher = new AntPathMatcher();private final Logger logger = LoggerFactory.getLogger("url.filter");/*** 白名单*/private String[] whiteListURLs = null;/*** 黑名单*/private String[] blackListURLs = null;@Overridepublic final void init(FilterConfig config) throws ServletException {this.config = config;this.initConfig();this.init();}/*** 子类覆盖* * @throws ServletException*/public void init() throws ServletException {}/*** 1、黑名单匹配 2、白名单匹配*/@Overridepublic final void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;HttpServletResponse httpResponse = (HttpServletResponse) response;String currentURL = httpRequest.getServletPath();logger.debug("url filter : current url : [{}]", currentURL);if (isBlackURL(currentURL)) {chain.doFilter(request, response);return;}if (isWhiteURL(currentURL)) {doFilter(httpRequest, httpResponse, chain);return;}logger.debug("url filter : no url list matches : [{}] break", currentURL);chain.doFilter(request, response);return;}private boolean isWhiteURL(String currentURL) {for (String whiteURL : whiteListURLs) {if (pathMatcher.match(whiteURL, currentURL)) {logger.debug("url filter : white url list matches : [{}] match [{}] continue", whiteURL, currentURL);return true;}logger.debug("url filter : white url list not matches : [{}] match [{}]", whiteURL, currentURL);}return false;}private boolean isBlackURL(String currentURL) {for (String blackURL : blackListURLs) {if (pathMatcher.match(blackURL, currentURL)) {logger.debug("url filter : black url list matches : [{}] match [{}] break", blackURL, currentURL);return true;}logger.debug("url filter : black url list not matches : [{}] match [{}]", blackURL, currentURL);}return false;}/*** 子类覆盖* * @param request* @param response* @param chain* @throws IOException* @throws ServletException*/public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws IOException, ServletException {chain.doFilter(request, response);}/*** 子类覆盖*/@Overridepublic void destroy() {}private void initConfig() {String whiteListURLStr = this.config.getInitParameter("whiteListURL");whiteListURLs = strToArray(whiteListURLStr);String blackListURLStr = this.config.getInitParameter("blackListURL");blackListURLs = strToArray(blackListURLStr);}private String[] strToArray(String urlStr) {if (urlStr == null) {return NULL_STRING_ARRAY;}String[] urlArray = urlStr.split(URL_SPLIT_PATTERN);List<String> urlList = new ArrayList<String>();for (String url : urlArray) {url = url.trim();if (url.length() == 0) {continue;}urlList.add(url);}return urlList.toArray(NULL_STRING_ARRAY);}public FilterConfig getConfig() {return config;}
}
具体使用如下:
package com.sishuok.web.filter;import java.io.IOException;import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class TestFilter extends BaseFilter {@Overridepublic void init() throws ServletException {//初始化FilterConfig config = getConfig();}@Overridepublic void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("==============");chain.doFilter(request, response);}@Overridepublic void destroy() {//销毁}}
xml配置如下:
<filter><filter-name>TestFilter</filter-name><filter-class>com.sishuok.web.filter.TestFilter</filter-class><!-- url分隔符可以是 换行 空格 分号 逗号 白名单和黑名单都是可选--><init-param><param-name>blackListURL</param-name> <!-- 配置黑名单url 表示不走过滤器的url order:1 --><param-value>/aa/bb/**/cc/*</param-value></init-param><init-param><param-name>whiteListURL</param-name> <!-- 配置白名单url 表示走过滤器的url order:2--><param-value>/dd;/ee,/ff /list</param-value></init-param></filter><filter-mapping><filter-name>TestFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
具备白名单、黑名单的Filter基类扩展相关推荐
- 文件上传漏洞总结(含原因+防御措施)+白名单+黑名单+内容、头+解析漏洞/修补方案
文件上传漏洞简单总结+白名单+黑名单+内容.头+解析漏洞/修补方案 问题 什么是文件上传漏洞? 危害? 防御措施? 文件上传(验证/绕过)措施? 前端 js类绕过? 后端 黑名单绕过 特殊解析后缀 . ...
- kepp-alive的作用?keep-alive的属性?路由元信息?白名单黑名单?keep-alive的钩子函数
keep-alive它自身不会渲染一个dom元素,也不会出现在父组件中,作为标签使用包裹在需要缓存的组件外 路由元信息 如果要缓存部分页面可以使用路由元信息 <keep-alive>< ...
- Tomcat IP白名单/黑名单配置
理想情况下,用户应该使用网络防火墙来限制基于 IP 的访问.然而,利用Tomcat 应用服务器也可以实现的. 步骤 进行备份并打开 server.xml 搜索<Valve className ...
- Oracle数据库IP访问限制(IP白名单黑名单)
1.编辑sqlnet.ora 内容为: #允许访问的IP(白名单) TCP.INVITED_NODES=(127.0.0.1,192.168.56.109,ip2,ip3,..,..本地IP..)若使 ...
- 使用logcat命令增加logd白名单 黑名单
Logd的白名单和黑名单我们在之前的logd中分析过了,这里的白名单和黑名单只是在logd丢失log时使用.logd丢失log会先删除黑名单的log,然后删除普通log.最后还不够的话再删除白名单的l ...
- 黑名单白名单_白名单/黑名单
黑名单白名单 Some comments made on Drew's blog interest me. Doing a search on Google, the term 'whitelist' ...
- 计算ip白名单/黑名单
故事的开头是:为了安全,服务器访问应该配置一个可以访问的白名单. 过了几天,运维组提要求:得把开发的网段给剔出去,但是还要留几个ip给开发负责验证的用. 偏偏管理平台功能有限,只能设置成白名单.我这一 ...
- 文件上传后端黑名单白名单绕过
大家好! 我是小黄,很高兴又跟大家见面啦 ! 拒绝水文,从我做起 !!!! 未经允许,禁止转载 ,违者必究!!!! 本实验仅适用于学习和测试 ,严禁违法操作 ! ! ! 今天更新的是: 文件上传后端黑 ...
- vb.net 判断是否为ip 正则_PHP实现IP白名单
有些项目可能会用到一个IP地址的白名单黑名单之类的验证. 比如,只有IP地址在白名单中,才可以访问该系统. 那么此时,白名单的维护,一般是一个文件,里边是一些IP地址(每行一个IP),当然也有的可能是 ...
最新文章
- mysql设计表时 varchar长度_设计表的时候,对变长字段长度选择的一点思考
- python语言程序设计基础网课-Python语言程序设计基础答案
- 整合NHibernate到Spring.Net (之一)
- python相关工具
- Nexys4DDR手写数字图像识别
- 一个显示器分两个屏幕_桌面改造计划2.0:一个显示器不够那就两个,桌面好物分享...
- inside-the-linux-kernel-full
- paip.PHP实现跨平台跨语言加解密方法
- 生物医学传感器实验装置
- unity3d 坦克大战实战
- K.gather()
- python语言的三种基本结构_Python语言基础分支语句、循环语句.PPT
- Vue教程-day05-2018年12月25日笔记
- 获取windows系统时间
- JS中 ?? 与 || 的区别
- Python开发一个《真三国无双20th纪念》人物羁绊计算器
- 三一重机遇到百度智能云,工程机械维保有了新方案
- TypeScript类型中的逆变协变
- 高配电脑玩LOL(卡顿),i5-12600K,B660主板,2060亲测有效
- Android自定义心率图表