问题引入:

比如定义了一个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基类扩展相关推荐

  1. 文件上传漏洞总结(含原因+防御措施)+白名单+黑名单+内容、头+解析漏洞/修补方案

    文件上传漏洞简单总结+白名单+黑名单+内容.头+解析漏洞/修补方案 问题 什么是文件上传漏洞? 危害? 防御措施? 文件上传(验证/绕过)措施? 前端 js类绕过? 后端 黑名单绕过 特殊解析后缀 . ...

  2. kepp-alive的作用?keep-alive的属性?路由元信息?白名单黑名单?keep-alive的钩子函数

    keep-alive它自身不会渲染一个dom元素,也不会出现在父组件中,作为标签使用包裹在需要缓存的组件外 路由元信息 如果要缓存部分页面可以使用路由元信息 <keep-alive>< ...

  3. Tomcat IP白名单/黑名单配置

      理想情况下,用户应该使用网络防火墙来限制基于 IP 的访问.然而,利用Tomcat 应用服务器也可以实现的. 步骤 进行备份并打开 server.xml 搜索<Valve className ...

  4. Oracle数据库IP访问限制(IP白名单黑名单)

    1.编辑sqlnet.ora 内容为: #允许访问的IP(白名单) TCP.INVITED_NODES=(127.0.0.1,192.168.56.109,ip2,ip3,..,..本地IP..)若使 ...

  5. 使用logcat命令增加logd白名单 黑名单

    Logd的白名单和黑名单我们在之前的logd中分析过了,这里的白名单和黑名单只是在logd丢失log时使用.logd丢失log会先删除黑名单的log,然后删除普通log.最后还不够的话再删除白名单的l ...

  6. 黑名单白名单_白名单/黑名单

    黑名单白名单 Some comments made on Drew's blog interest me. Doing a search on Google, the term 'whitelist' ...

  7. 计算ip白名单/黑名单

    故事的开头是:为了安全,服务器访问应该配置一个可以访问的白名单. 过了几天,运维组提要求:得把开发的网段给剔出去,但是还要留几个ip给开发负责验证的用. 偏偏管理平台功能有限,只能设置成白名单.我这一 ...

  8. 文件上传后端黑名单白名单绕过

    大家好! 我是小黄,很高兴又跟大家见面啦 ! 拒绝水文,从我做起 !!!! 未经允许,禁止转载 ,违者必究!!!! 本实验仅适用于学习和测试 ,严禁违法操作 ! ! ! 今天更新的是: 文件上传后端黑 ...

  9. vb.net 判断是否为ip 正则_PHP实现IP白名单

    有些项目可能会用到一个IP地址的白名单黑名单之类的验证. 比如,只有IP地址在白名单中,才可以访问该系统. 那么此时,白名单的维护,一般是一个文件,里边是一些IP地址(每行一个IP),当然也有的可能是 ...

最新文章

  1. mysql设计表时 varchar长度_设计表的时候,对变长字段长度选择的一点思考
  2. python语言程序设计基础网课-Python语言程序设计基础答案
  3. 整合NHibernate到Spring.Net (之一)
  4. python相关工具
  5. Nexys4DDR手写数字图像识别
  6. 一个显示器分两个屏幕_桌面改造计划2.0:一个显示器不够那就两个,桌面好物分享...
  7. inside-the-linux-kernel-full
  8. paip.PHP实现跨平台跨语言加解密方法
  9. 生物医学传感器实验装置
  10. unity3d 坦克大战实战
  11. K.gather()
  12. python语言的三种基本结构_Python语言基础分支语句、循环语句.PPT
  13. Vue教程-day05-2018年12月25日笔记
  14. 获取windows系统时间
  15. JS中 ?? 与 || 的区别
  16. Python开发一个《真三国无双20th纪念》人物羁绊计算器
  17. 三一重机遇到百度智能云,工程机械维保有了新方案
  18. TypeScript类型中的逆变协变
  19. 高配电脑玩LOL(卡顿),i5-12600K,B660主板,2060亲测有效
  20. Android自定义心率图表

热门文章

  1. 软件设计期末考试重点内容
  2. Excel生成报表之解决方案--设置单个单元格格式
  3. android requestFocus的使用
  4. android 分享图片和视频
  5. 实验四---继承与派生练习以及运算符[ ]重载练习
  6. 基于nodejs实现每天固定时间发送邮件服务
  7. RabbitMQ—性能测试
  8. WebJars——web端静态资源的jar包
  9. 父类和子类在同一张表
  10. js网页返回页面顶部的小方法