具备白名单、黑名单的Filter基类扩展
生活随笔
收集整理的這篇文章主要介紹了
具备白名单、黑名单的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基类扩展的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Statement和PreparedSt
- 下一篇: android日常开发60条经验