<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 一、監聽器 ### 1.1 定義 Servlet 監聽器是 Servlet 規范中定義的一種特殊類,用于監聽 ServletContext、HttpSession 和 ServletRequest 等域對象的創建與銷毀事件,以及監聽這些域對象中屬性發生修改的事件。監聽器是觀察者模式的應用,它關注特定事物,并伺機而動,所以監聽器具有**異步**的特性。 Servlet Listener 監聽三大域對象的創建和銷毀事件,三大對象分別是: 1. ServletContext:application 級別,整個應用只存在一個,可以進行全局應用配置。 2. HttpSession:session 級別,針對每一個對話,如統計會話總數。 3. ServletRequest:request 級別,針對每一個客戶請求, ### 1.2 使用場景 Servlet 規范設計監聽器的作用是在事件發生前、發生后進行一些處理,一般可以用來統計在線人數和在線用戶、統計網站訪問量、系統啟動時初始化信息等。我們可以在容器啟動時初始化 Log4j 信息,添加自己對容器狀態的監控,初始化 Spring 組件等。 ### 1.3 監聽器的實現 創建一個ServletRequest監聽器(其他監聽器類似創建) ~~~ @WebListener @Slf4j public class Customlister implements ServletRequestListener{ @Override public void requestDestroyed(ServletRequestEvent sre) { log.info(" request監聽器:銷毀"); } @Override public void requestInitialized(ServletRequestEvent sre) { log.info(" request監聽器:可以在這里記錄訪問次數哦"); } } ~~~ ![](https://img.kancloud.cn/28/92/289242a0d161593b4fd8ccbcf3de0525_502x307.png) 在啟動類中加入@ServletComponentScan進行自動注冊即可。 ![](https://img.kancloud.cn/e5/eb/e5ebd30444e69a1cd3445d9801dea2ea_1604x602.png) ![](https://img.kancloud.cn/be/81/be811e551f28061cffbb7fdb5e157ed7_1246x277.png) ## 二、過濾器 ### 2.1 定義 過濾器是一種可重用的代碼,可以轉換 HTTP 請求、響應和頭信息,通俗來說就是過濾器可以在請求到達服務器之前,對請求頭進行預先處理,在響應內容到達客戶端之前,對服務器做出的響應進行后置處理。 根據這個定義,我們就不難理解為什么它是位于 Listener 的下游,Servlet 的上游了?過濾器必須是在容器啟動之后,接收到請求后開始處理,所以它是在 Listener 執行之后;在請求到達 Servlet 之前進行預處理,所以它又處于 Servlet 之前的位置。 從命名上理解,它就是對**請求和響應的數據**內容進行過濾處理的,并非前端傳過來的數據都全單接收,而是有原則地進行過濾處理,以保證后端服務器業務的安全。 ### 2.2 使用場景 Servlet 3.1 中定義了幾種常見的過濾器組件: | 過濾器 | 作用 | | --- | --- | | Authentication filters: | 授權類,如用戶登陸會話校驗; | | Logging and auditing filters: | 日志和安全審計類; | | Image conversion filters: | 圖片轉換; | | Data compression filters: | 數據壓縮; | | Encryption filters: | 加密、解密類; | | Tokenizing filters: | 詞法類; | | Filters that trigger resource access events: | 觸發資源訪問事件類; | | XSL/T filters that transform XML content: | XML文件轉換類; | | MIME-type chain filters: | MIME文件; | | Caching filters: | 緩存類; | 或者我們社交應用經常需要的敏感詞過濾,都可以使用過濾器。過濾器主要的特點在于,它能夠改變請求內容。 ### 2.3 過濾器的實現 過濾器Filter,是Servlet的的一個實用技術了。可通過過濾器,對請求進行攔截,比如讀取session判斷用戶是否登錄、判斷訪問的請求URL是否有訪問權限(黑白名單)等。主要還是可對請求進行預處理。接下來介紹下,在springboot如何實現過濾器功能。 **1.1 實現方式一:利用WebFilter注解配置** @WebFilter時Servlet3.0新增的注解,原先實現過濾器,需要在web.xml中進行配置,而現在通過此注解,啟動啟動時會自動掃描自動注冊。 編寫Filter類: ~~~ //注冊器名稱為customFilter,攔截的url為所有 @WebFilter(filterName="customFilter",urlPatterns={"/*"}) @Slf4j public class CustomFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("filter 初始化"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { log.info("customFilter 請求處理之前"); //對request、response進行一些預處理 // 比如設置請求編碼 // request.setCharacterEncoding("UTF-8"); // response.setCharacterEncoding("UTF-8"); //鏈路 直接傳給下一個過濾器 chain.doFilter(request, response); log.info("customFilter 請求處理之后"); } @Override public void destroy() { log.info("filter 銷毀"); } } ~~~ ![](https://img.kancloud.cn/6d/c4/6dc4aa98ccce0bbecb83390b63df314e_503x223.png) 然后在啟動類加入@ServletComponentScan注解即可。 可以看到啟動時加載了filter,刷新頁面時前后也有filter ![](https://img.kancloud.cn/1d/dd/1dddbd459914823be2fb61db377f8d32_1167x224.png) ![](https://img.kancloud.cn/e3/96/e396930db2ffbaaee3cccd1f9352cbfd_1776x312.png) 使用這種方法,當注冊多個過濾器時,無法指定執行順序的,原本使用web.xml配置過濾器時,是可指定執行順序的,但使用@WebFilter時,沒有這個配置屬性的(需要配合@Order進行),所以接下來介紹下通過FilterRegistrationBean進行過濾器的注冊。 > –小技巧 > 通過過濾器的java類名稱,進行順序的約定,比如LogFilter和AuthFilter,此時AuthFilter就會比LogFilter先執行,因為首字母A比L前面。 **1.2.FilterRegistrationBean方式** FilterRegistrationBean是springboot提供的,此類提供setOrder方法,可以為filter設置排序值,讓spring在注冊web filter之前排序后再依次注冊。 首先要改寫filter, 其實就除了@webFilter注解即可。其他的都沒有變化。啟動類中利用@bean注冊FilterRegistrationBean ~~~ @Configuration public class FilterRegistration { @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean registration = new FilterRegistrationBean(); //當過濾器有注入其他bean類時,可直接通過@bean的方式進行實體類過濾器,這樣不可自動注入過濾器使用的其他bean類。 //當然,若無其他bean需要獲取時,可直接new CustomFilter(),也可使用getBean的方式。 registration.setFilter(customFilter()); //過濾器名稱 registration.setName("customFilter"); //攔截路徑 registration.addUrlPatterns("/*"); //設置順序 registration.setOrder(10); return registration; } @Bean public Filter customFilter() { return new CustomFilter(); } } ~~~ 注冊多個時,就注冊多個FilterRegistrationBean即可,啟動后,效果和第一種是一樣的。 ![](https://img.kancloud.cn/c9/5b/c95b0f380213e824a81aa305cd2da8ad_429x245.png) 創建customFilter2來驗證 有了 **.FilterRegistrationBean**后,已經在里面設置了攔截,customFilter就不需要過濾注解了 ![](https://img.kancloud.cn/3e/5a/3e5a3e5b631b30cb980eb0f1e306a544_518x120.png) ![](https://img.kancloud.cn/80/50/8050afc42b4097d887ff752fcf3902e1_745x118.png) ![](https://img.kancloud.cn/31/ae/31aea0476e64541d354a2ddf4201b659_1771x514.png) ## 三、servlet ### 3.1定義: 在java程序員10年以前做web開發的時候,所有的請求都是由servlet來接受并響應的。每一個請求,就要寫一個servlet。這種方式很麻煩,大家就想能不能根據請求的路徑以及參數不同,映射到不同的方法上去執行,這樣就可以在一個servlet類里面處理多個請求,每個請求就是一個方法。這個思想后來就主鍵發展為structs、SpringMVC。 ### 3.2使用場景 目前來看,servlet使用的場景已經被springMVC架構全面覆蓋。但是不排除,老項目向spring boot項目遷移,需要支持servlet的情況。 ### 3.3 實現 下面我們就看一下,在spring boot里面如何實現servlet。 ~~~ @WebServlet(name = "firstServlet", urlPatterns = "/firstServlet") //標記為servlet,以便啟動器掃描。 public class FirstServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().append("firstServlet"); } } ~~~ 然后在啟動類加入@ServletComponentScan注解即可。 因為是severlet寫法,可以直接引用頁面鏈接返回 ![](https://img.kancloud.cn/df/66/df6621a3245b6085962ca4bac53ccdd4_691x172.png) 過濾器的鏈路執行情況 ![](https://img.kancloud.cn/f6/f4/f6f48a18c9fce99fd56ccf39fad4183b_1690x255.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看