java: filter design

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;
}


?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容