一、什麼是DelegatingFilterProxy
在Java Web開發中,filter是對web請求進行預處理和後處理的一種機制。在應用啟動時,filter就被初始化,在整個應用程序的生命周期中,每個請求都會經過filter。在原有的filter機制下,每個filter都需要定義一個具體的實現類,這樣就會造成代碼過多、難以維護等問題。DelegatingFilterProxy是SpringMVC中所提出的一個機制,它可以將具體的filter交由Spring容器來管理,從而使得開發者可以更加便捷地進行filter的管理、維護。
二、 DelegatingFilterProxy的作用
1、初始化及銷毀
DelegatingFilterProxy是一個代理類,用於代替具體的filter實現類。在使用DelegatingFilterProxy時,需要在web.xml配置文件中註冊filter,並且給filter指定一個beanName,在SpringMVC容器中以該beanName註冊一個filter Bean。
2、控制執行順序
DelegatingFilterProxy可以控制多個filter的執行順序。在web應用的過濾器鏈中,每個filter都需要指定一個url-pattern,該url-pattern指定了哪些請求需要被該filter攔截。在多個filter的情況下,如果filter之間存在依賴關係,需要按照一定的順序執行,否則會出現錯誤。DelegatingFilterProxy可以通過簡單的配置來控制filter的執行順序。
3、提供更多的配置選項
DelegatingFilterProxy還提供了更多的基於Spring的配置選項。Spring框架提供了大量的擴展選項,DelegatingFilterProxy使得這些擴展選項可以與filter機制進行整合。
三、DelegatingFilterProxy的使用示例
以下代碼演示了如何在web.xml文件中聲明一個DelegatingFilterProxy,並在SpringMVC配置文件中進行配置:
1、在web.xml文件中聲明一個DelegatingFilterProxy
    
    
        demoFilter
        org.springframework.web.filter.DelegatingFilterProxy 
        
            targetBeanName
            demoFilterBean
        
    
    
        demoFilter
        /*
    
    
2、在SpringMVC配置文件中註冊DelegatingFilterProxy Bean
    
        
    
3、在具體的filter實現類中進行配置
    
    public class DemoFilterImpl implements Filter {
        private FilterConfig filterConfig;
        public void destroy() {
            // TODO Auto-generated method stub
            System.out.println("DemoFilter:destroy.");
        }
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            System.out.println("DemoFilter:doFilter.");
            chain.doFilter(request, response);
        }
        public void init(FilterConfig filterConfig) throws ServletException {
            this.filterConfig = filterConfig;
            System.out.println("DemoFilter:init.");
        }
    }
    
四、DelegatingFilterProxy的執行順序控制
DelegatingFilterProxy還提供了一些控制執行順序的配置選項。如下代碼演示了如何通過DelegatingFilterProxy來控制多個filter的執行順序:
1、在web.xml文件中聲明DelegatingFilterProxy並指定init-param
    
    
        demoFilter1
        org.springframework.web.filter.DelegatingFilterProxy 
        
            targetBeanName
            demoFilter1Bean
        
    
    
        demoFilter2
        org.springframework.web.filter.DelegatingFilterProxy 
        
            targetBeanName
            demoFilter2Bean
        
    
    
        demoFilter1
        /*
    
    
        demoFilter2
        /*
    
    
2、在SpringMVC配置文件中註冊Filter Bean
    
      
      
    
3、在具體Filter實現類中加入@WebFilter註解並指定filterName
在具體的Filter實現類中加入@WebFilter註解並指定filterName。filterName的名稱需要與在web.xml中配置的filterName一致。這個配置可以控制filter的執行順序。
    
    @WebFilter(filterName="demoFilter1")
    public class DemoFilter1Impl implements Filter {
        private FilterConfig filterConfig;
        public void destroy() {
            // TODO Auto-generated method stub
            System.out.println("DemoFilter1:destroy.");
        }
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            System.out.println("DemoFilter1:doFilter.");
            chain.doFilter(request, response);
        }
        public void init(FilterConfig filterConfig) throws ServletException {
            this.filterConfig = filterConfig;
            System.out.println("DemoFilter1:init.");
        }
    }
    
    
    @WebFilter(filterName="demoFilter2")
    public class DemoFilter2Impl implements Filter {
        private FilterConfig filterConfig;
        public void destroy() {
            // TODO Auto-generated method stub
            System.out.println("DemoFilter2:destroy.");
        }
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            System.out.println("DemoFilter2:doFilter.");
            chain.doFilter(request, response);
        }
        public void init(FilterConfig filterConfig) throws ServletException {
            this.filterConfig = filterConfig;
            System.out.println("DemoFilter2:init.");
        }
    }
    
五、DelegatingFilterProxy的優缺點
1、優點
DelegatingFilterProxy可以將filter代理給Spring容器進行管理,使得開發者可以更加便捷地進行filter的管理、維護。同時也提供了更多的基於Spring的配置選項,使得擴展性更加強。
2、缺點
DelegatingFilterProxy只能代理實現Filter介面的類,無法代理實現javax.servlet.http.HttpServlet的類。另外,由於需要在web.xml中進行配置,對於大型項目來說這可能會導致web.xml文件過於臃腫,不太方便管理。
六、總結
DelegatingFilterProxy是SpringMVC中一個非常重要的機制,通過DelegatingFilterProxy可以將filter交由SpringMVC容器來進行管理。DelegatingFilterProxy提供了多種配置選項,可以控制filter的執行順序、提供更多的基於Spring的擴展選項等。但是需要注意,由於需要在web.xml中進行配置,可能會導致web.xml文件過於臃腫。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/254517.html
 
 微信掃一掃
微信掃一掃  支付寶掃一掃
支付寶掃一掃 