簡介

          依賴于servlet容器。在實現(xiàn)上基于函數(shù)回調,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器實例只能在容器初始化時調用一次。

          使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取的數(shù)據(jù)。


          WEB開發(fā)人員通過Filter技術,對web服務器管理的所有web資源:例如JSP,Servlet,靜態(tài)圖片文件或靜態(tài)HTML文件進行攔截,從而實現(xiàn)一些特殊功能。例如實現(xiàn)URL級別的權限控制、過濾敏感詞匯、壓縮響應信息、過濾器中修改字符編碼等一些高級功能。

          Filter工作原理


          當客戶端發(fā)出Web資源的請求時,Web服務器根據(jù)應用程序配置文件設置的過濾規(guī)則進行檢查,若客戶請求滿足過濾規(guī)則,則對客戶請求/響應進行攔截,對請求頭和請求數(shù)據(jù)進行檢查或改動,并依次通過過濾器鏈,最后把請求/響應交給請求的Web資源處理。請求信息在過濾器鏈中可以被修改,也可以根據(jù)條件讓請求不發(fā)往資源處理器,并直接向客戶機發(fā)回一個響應。當資源處理器完成了對資源的處理后,響應信息將逐級逆向返回。同樣在這個過程中,用戶可以修改響應信息,從而完成一定的任務

          常見問題

          Web開發(fā)中,自定義過濾器被執(zhí)行兩次的原因分析。
          導致原因:第一次打印的是我請求的Servlet,第二次打印的是/favicon.ico

          1、@WebFilter配置Filter過濾器
          @Configuration//將此Filter交給Spring容器管理 @WebFilter(urlPatterns = "/*", filterName
          = "logFilter2") @Order(1)//指定過濾器的執(zhí)行順序,值越大越靠后執(zhí)行 public class LogCostFilter2
          implements Filter { @Override public void init(FilterConfig filterConfig)
          throws ServletException { System.out.println("過濾器2-init"); } @Override public
          void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
          FilterChain filterChain) throws IOException, ServletException {
          System.out.println("過濾器2-doFilter-前"); long start = System.currentTimeMillis();
          filterChain.doFilter(servletRequest, servletResponse);
          System.out.println("LogFilter2 Execute cost=" + (System.currentTimeMillis() -
          start)); System.out.println("過濾器2-doFilter-后"); } @Override public void
          destroy() { System.out.println("過濾器2-destroy"); }
          }

          2、FilterRegistrationBean配置Filter過濾器
          public class LogCostFilter implements Filter { @Override public void
          init(FilterConfig filterConfig) throws ServletException {
          System.out.println("過濾器1-init"); } @Override public void
          doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
          FilterChain filterChain) throws IOException, ServletException {
          System.out.println("過濾器1-doFilter-前"); long start = System.currentTimeMillis();
          filterChain.doFilter(servletRequest,servletResponse);
          System.out.println("LogFilter1 Execute
          cost="+(System.currentTimeMillis()-start));
          System.out.println("過濾器1-doFilter-后"); } @Override public void destroy() {
          System.out.println("過濾器1-destroy"); } }
          使用FilterRegistrationBean來完成配置
          @Configuration public class FilterConfig { @Bean public FilterRegistrationBean
          registFilter() { FilterRegistrationBean registration = new
          FilterRegistrationBean(); registration.setFilter(new LogCostFilter());
          registration.addUrlPatterns("/*"); registration.setName("LogCostFilter");
          registration.setOrder(1); return registration; }
          }

          測試用例
          @GetMapping("/filter/{id}") public void filter(@PathVariable("id") Long id) {
          System.out.println("Controller方法--前"); UserEntity userEntity =
          userService.findUserById(id); System.out.println("Controller方法--后"); }
          運行結構

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關注微信

                日韩欧美在线免费 | 国产三级在线免费观看 | 91精品91久久久久77777 | 青青草伊人网 | A色黄片 香蕉乱轮网 |