public final class ApplicationFilterChain implements FilterChain {
private ApplicationFilterConfig[] filters = new ApplicationFilterConfig[0];
private int pos = 0;
private int n = 0;
@Override
public void doFilter(ServletRequest request, ServletResponse response)
throws IOException, ServletException {
internalDoFilter(request,response);
}
private void internalDoFilter(ServletRequest request,
ServletResponse response)
throws IOException, ServletException {
if (pos < n) {
ApplicationFilterConfig filterConfig = filters[pos++];
Filter filter = filterConfig.getFilter();
filter.doFilter(request, response, this);
}
}
}
privatevoidinternalDoFilter(ServletRequestrequest,ServletResponseresponse){
if(pos<n) {
ApplicationFilterConfigfilterConfig=filters[pos++];
Filterfilter=filterConfig.getFilter();
try{
filter.doFilter(request,response,this);
}catch(IOException|ServletExceptione){
}
}else{
if((request instanceof HttpServletRequest)&&(response instanceof HttpServletResponse)){
servlet.service((HttpServletRequest)request,(HttpServletResponse)response);
}else{
servlet.service(request,response);
}
}
}
privatestaticbooleanmatches(ServletRequestrequest,ApplicationFilterConfigfilterConfig) {
FilterDeffilterDef=filterConfig.getFilterDef();
StringurlPattern=filterDef.getUrlPattern();
String[]dispatcherTypes=filterDef.getDispatcher();
if(!matchesUrlPattern(request,urlPattern)){
returnfalse;
}
if(dispatcherTypes!=null&&dispatcherTypes.length>0){
StringdispatcherType=request.getAttribute("javax.servlet.dispatcher.type").toString();
if(!Arrays.asList(dispatcherTypes).contains(dispatcherType)){
returnfalse;
}
}
returntrue;
}
public static ApplicationFilterChain createFilterChain(ServletRequest request, Wrapper wrapper, Servlet servlet) {
ServletContext servletContext = wrapper.getServletConfig().getServletContext();
ApplicationFilterConfig[] filterMaps = getFilterMaps(servletContext);
ApplicationFilterChain filterChain = new ApplicationFilterChain();
for (int i = 0; i < filterMaps.length; i++) {
ApplicationFilterConfig filterConfig = filterMaps[i];
if (matches(request, filterConfig)) {
filterChain.addFilter(filterConfig);
}
}
if (filterChain.size() == 0) {
filterChain.setServlet(servlet);
} else {
filterChain.setServlet(servlet);
}
return filterChain;
}
java: filter design
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
推薦閱讀更多精彩內容
- This is a very professional calculator. The user can calc...
- This is a professional software. Suitable for professiona...
- The Notch Filter is a combination of an inductor and a ca...
- 問題 啟動SpringBoot項目時,報錯: 雙擊該問題,跳轉到WebSecurityConfigurerAdap...
- 本文使用 文章同步助手[http://www.lxweimin.com/p/5709df6fb58d] 同步