<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官:談?wù)勥^(guò)濾器和攔截器的區(qū)別?

          共 9407字,需瀏覽 19分鐘

           ·

          2022-10-28 02:24

          ????關(guān)注后回復(fù) “進(jìn)群” ,拉你進(jìn)程序員交流群????


          來(lái)源:blog.csdn.net/qq_42924666/article/details/109563?p?400

          ?

          • 一、攔截器和過(guò)濾器的區(qū)別
          • 二、攔截器和過(guò)濾器的代碼實(shí)現(xiàn)
          • 三、總結(jié)
            • 1、什么是Filter及其作用介紹
            • 2、Filter API介紹
            • 3、Filter鏈與Filter生命周期
          • 四、攔截器
          • 五、過(guò)濾器和攔截器的區(qū)別

          一、攔截器和過(guò)濾器的區(qū)別

          1、攔截器(Interceptor)只對(duì)action請(qǐng)求起作用 即對(duì)外訪問(wèn)路徑

          而過(guò)濾器(Filter)則可以對(duì)幾乎所有的請(qǐng)求都能起作用 包括css js等資源文件

          2、攔截器(Interceptor)是在Servlet和Controller控制器之間執(zhí)行

          而過(guò)濾器(Filter)是在請(qǐng)求進(jìn)入Tomcat容器之后 但是在請(qǐng)求進(jìn)入Servlet之前執(zhí)行

          web.xml加載順序:context- param -> listener -> filter -> servlet

          在請(qǐng)求結(jié)束返回時(shí)也是一樣 是在Servlet處理完之后返回給前端之間執(zhí)行

          圖片

          二、攔截器和過(guò)濾器的代碼實(shí)現(xiàn)

          1、攔截器

          首先需要一個(gè)攔截器類 并且這個(gè)類要實(shí)現(xiàn)HandlerInterceptor接口

          這個(gè)接口里面有三個(gè)方法:

          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
          {
              // 在攔截點(diǎn)(Controller方法處理之前)執(zhí)行攔截 若返回的是false則中斷執(zhí)行 反之亦然
              return false;
          }

          @Override
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
          {
              // 在處理過(guò)程中(Controller方法處理完之后  DispatcherServlet進(jìn)行視圖的渲染之前)執(zhí)行攔截
          }

          @Override
          public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
          {
              // 在DispatcherServlet進(jìn)行視圖的渲染后 返回前進(jìn)行攔截
          }

          稍微寫一下方法:

          @Override
           public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
           {
               // 在Controller方法處理之前執(zhí)行攔截 若返回的是false則中斷執(zhí)行 反之亦然
           
               // 判斷當(dāng)前的User是否為空 若不為空則不攔截
               if (request.getSession().getAttribute("USERINFO")!=null)
               {
                   return true;
               }
               // 進(jìn)行攔截 返回登錄界面
               response.sendRedirect(request.getContextPath()+"/user/doLogin.do");
               return false;
           }

          然后需要去SpringMVC的配置文件中配置攔截器:

          <!-- 配置攔截器 -->
          <mvc:interceptors>
              <mvc:interceptor>
                  <!-- 攔截所有的mvc控制器(Controller) -->
                  <mvc:mapping path="/**"/>
                  <!-- 放行機(jī)制 指定對(duì)某個(gè)頁(yè)面不進(jìn)行攔截 -->
                  <!-- 攔截器只對(duì)action起作用 因此填入的不是頁(yè)面路徑 而是方法 -->
                  <mvc:exclude-mapping path="/user/doLogin.do"/>
                  <!-- 指定使用哪個(gè)攔截器 -->
                  <bean class="net.zjitc.interceptor.LoginInterceptor"/>
              </mvc:interceptor>
          </mvc:interceptors>

          如此 當(dāng)訪問(wèn)的請(qǐng)求不為/user/doLogin.do會(huì)被攔截然后重定向到/user/doLogin.do

          但是訪問(wèn)其它的頁(yè)面不會(huì)被攔截

          想要讓頁(yè)面也被攔截?你需要過(guò)濾器!

          2、過(guò)濾器

          同理 需要一個(gè)過(guò)濾器類 然后實(shí)現(xiàn)javax.servlet.Filter接口

          注意Filter的路徑別導(dǎo)錯(cuò)了 因?yàn)橛泻芏嗤涌?/p>

          public class LoginFilter implements Filter {

              @Override
              public void init(FilterConfig filterConfig) throws ServletException
              {
                  // 過(guò)濾器初始化
              }

              @Override
              public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
              {

              }

              @Override
              public void destroy()
              {
                  // 過(guò)濾器銷毀
              }
          }

          稍微寫一下方法:

          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
          {
              // ServletRequest是一個(gè)接口 而HttpServletRequest是接口的實(shí)現(xiàn)
              // 但有些方法是HttpServletRequest獨(dú)有的 例如getSession()
              // HttpServletRequest接口繼承自ServletRequest接口 增加了和Http相關(guān)的方法
              // 但是我們可以強(qiáng)制轉(zhuǎn)換
              HttpServletRequest request=(HttpServletRequest)servletRequest;
              HttpServletResponse response=(HttpServletResponse)servletResponse;

              // 若用戶沒(méi)有登錄
              if (request.getSession().getAttribute("USERINFO")==null && request.getRequestURI().indexOf("/user/doLogin.do")==-1)
              {
                  response.sendRedirect(request.getContextPath()+"/user/doLogin.do");
              }
              // 若用戶已經(jīng)登錄 則繼續(xù)下一個(gè)請(qǐng)求(繼續(xù)訪問(wèn))
              filterChain.doFilter(request,response);
          }

          然后需去web.xml中配置過(guò)濾器:

          <!-- 配置自定義的Filter 實(shí)現(xiàn)登錄控制 -->
           <filter>
               <filter-name>sessionFilter</filter-name>
               <filter-class>net.zjitc.filter.LoginFilter</filter-class>
           </filter>
           <filter-mapping>
               <filter-name>sessionFilter</filter-name>
               <!-- 攔截所有的頁(yè)面 /斜杠代表在webapp目錄下 -->
               <url-pattern>/pages/*</url-pattern>
               <url-pattern>/css/*</url-pattern>
               <url-pattern>/img/*</url-pattern>
               <url-pattern>/failer.jsp</url-pattern>
           </filter-mapping>

          三、總結(jié)

          攔截器和過(guò)濾器其實(shí)都是AOP編程思想的實(shí)現(xiàn)

          都可以體現(xiàn)例如權(quán)限的檢查 日志的記錄等功能

          但是有不同之處:

          1、使用范圍不同
          • 攔截器既可以用在web層 又可以用在Application和Swing程序中
          • 而filter是Servlet規(guī)范規(guī)定的 只能用于web程序中
          2、規(guī)范不同
          • 攔截器是在Spring容器內(nèi)的 是Spring框架支持的
          • 而filter是Servlet規(guī)范規(guī)定的 是Servlet容器支持的

          1、什么是Filter及其作用介紹

          (1)概念

          Servlet規(guī)范中三個(gè)技術(shù) Servlet Listener Filter(順序?yàn)長(zhǎng) F S)

          Filter是sun公司中servlet2.3后增加的一個(gè)新功能,在javaEE中定義了一個(gè)接口 javax.servlet.Filter來(lái)描述過(guò)濾器

          (2)作用

          通過(guò)Filter可以攔截訪問(wèn)web資源的請(qǐng)求與響應(yīng)操作。

          WEB開發(fā)人員通過(guò)Filter技術(shù),對(duì)web服務(wù)器管理的所有web資源:例如Jsp, Servlet, 靜態(tài)圖片文件或靜態(tài) html 文件等進(jìn)行攔截,從而實(shí)現(xiàn)一些特殊的功能。例如實(shí)現(xiàn)URL級(jí)別的權(quán)限訪問(wèn)控制、過(guò)濾敏感詞匯、壓縮響應(yīng)信息等一些高級(jí)功能。

          (3)舉例

          在java web中,針對(duì)傳入的request,或response提前過(guò)濾掉一些信息,或者提前設(shè)置一些參數(shù),然后再傳入servlet進(jìn)行業(yè)務(wù)邏輯,比如過(guò)濾掉非法url(不是login.do的地址請(qǐng)求,如果用戶沒(méi)有登陸都過(guò)濾掉),或者在傳入servlet或者 struts的action前統(tǒng)一設(shè)置字符集,或者去除掉一些非法字符。

          2、Filter API介紹

          Filter是javax.servlet包下的一個(gè)接口主要有以下三個(gè)方法

          destory()
          doFilter(ServletRequest request,ServletResponse response,FilterCjain chain)
          init(FilterConfig filterConfig)

          3、Filter鏈與Filter生命周期

          (1)Filter鏈介紹

          多個(gè)Filter對(duì)同一個(gè)資源進(jìn)行了攔截,那么當(dāng)我們?cè)陂_始的Filter中執(zhí)行chain.doFilter(request,response)時(shí),是訪問(wèn)下一下Filter,直到最后一個(gè)Filter執(zhí)行時(shí),它后面沒(méi)有了Filter,才會(huì)訪問(wèn)web資源。

          (2)關(guān)于多個(gè)FIlter的訪問(wèn)順序問(wèn)題

          如果有多個(gè)Filter形成了Filter鏈,那么它們的執(zhí)行順序是怎樣確定的?

          它們的執(zhí)行順序取決于在web.xml文件中配置的先后順序。

          (3)Filter生命周期

          • 當(dāng)服務(wù)器啟動(dòng),會(huì)創(chuàng)建Filter對(duì)象,并調(diào)用init方法,只調(diào)用一次.
          • 當(dāng)訪問(wèn)資源,路徑與Filter的攔截路徑匹配,會(huì)執(zhí)行Filter中的doFilter方法,這個(gè)方法是真正攔截操作的方法.
          • 當(dāng)服務(wù)器關(guān)閉時(shí),會(huì)調(diào)用Filter的destroy方法來(lái)進(jìn)行銷毀操作
          • 過(guò)濾器是JavaEE標(biāo)準(zhǔn),采用函數(shù)回調(diào)的方式進(jìn)行。是在請(qǐng)求進(jìn)入容器之后,還未進(jìn)入Servlet之前進(jìn)行預(yù)處理,并且在請(qǐng)求結(jié)束返回給前端這之間進(jìn)行后期處理。

          四、攔截器

          攔截器是spring容器的,是spring支持的

          java里的攔截器是動(dòng)態(tài)攔截Action調(diào)用的對(duì)象。它提供了一種機(jī)制可以使開發(fā)者可以定義在一個(gè)action執(zhí)行的前后執(zhí)行的代碼,也可以在一個(gè)action執(zhí)行前阻止其執(zhí)行,同時(shí)也提供了一種可以提取action中可重用部分的方式。

          在面向切面編程AOP(Aspect-Oriented Programming)中攔截器用于在某個(gè)方法或字段被訪問(wèn)之前,進(jìn)行攔截,然后在之前或之后加入某些操作。

          比如動(dòng)態(tài)代理就是攔截器的簡(jiǎn)單實(shí)現(xiàn),在你調(diào)用方法前打印出字符串(或者做其它業(yè)務(wù)邏輯的操作),也可以在你調(diào)用方法后打印出字符串,甚至在你拋出異常的時(shí)候做業(yè)務(wù)邏輯的操作。

          五、過(guò)濾器和攔截器的區(qū)別

          • ①攔截器是基于java的反射機(jī)制的,而過(guò)濾器是基于函數(shù)回調(diào)。
          • ②攔截器不依賴與servlet容器,過(guò)濾器依賴與servlet容器。
          • ③攔截器只能對(duì)action請(qǐng)求起作用,而過(guò)濾器則可以對(duì)幾乎所有的請(qǐng)求起作用。
          • ④攔截器可以訪問(wèn)action上下文、值棧里的對(duì)象,而過(guò)濾器不能訪問(wèn)。
          • ⑤在action的生命周期中,攔截器可以多次被調(diào)用,而過(guò)濾器只能在容器初始化時(shí)被調(diào)用一次。
          • ⑥攔截器可以獲取IOC容器中的各個(gè)bean,而過(guò)濾器就不行,這點(diǎn)很重要,在攔截器里注入一個(gè)service,可以調(diào)用業(yè)務(wù)邏輯。攔截器可以獲取ioc中的service bean實(shí)現(xiàn)業(yè)務(wù)邏輯。

          回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用其所指向的函數(shù)時(shí),我們就說(shuō)這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。

          Spring MVC中每個(gè)控制器中可以定義多個(gè)請(qǐng)求處理方法,我們把這種請(qǐng)求處理方法簡(jiǎn)稱為Action

          圖片

          -End-

          最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來(lái),可以說(shuō)是程序員面試必備!所有資料都整理到網(wǎng)盤了,歡迎下載!

          點(diǎn)擊??卡片,關(guān)注后回復(fù)【面試題】即可獲取

          在看點(diǎn)這里好文分享給更多人↓↓

          瀏覽 30
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91在线无码精品秘 入口楼乃 | 久久少妇久久 | 五月天久久久久久 | 亚洲人妻中文字幕 | 丁香六月婷婷综合 |