您好,登錄后才能下訂單哦!
這篇文章主要講解了“JavaWeb中怎么使用Filter和Listener”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JavaWeb中怎么使用Filter和Listener”吧!
過濾器:當訪問服務(wù)器的資源時,過濾器可以將請求攔截下來,完成一些特殊的功能。一般用于完成通用的操作。如:登錄驗證、統(tǒng)一編碼處理、敏感字符過濾...
過濾器相當于瀏覽器與 Web 資源之間的一道過濾網(wǎng),在訪問資源之前通過一系列的過濾器對請求進行修改、判斷以及攔截等,也可以對響應進行修改、判斷以及攔截等。
執(zhí)行流程:
客戶端發(fā)出請求,先經(jīng)過過濾器, 如果過濾器放行,那么才能到servlet
如果有多個過濾器, 那么他們會按照注冊的映射順序 來 排隊。 只要有一個過濾器, 不放行,那么后面排隊的過濾器以及咱們的servlet都不會收到請求。
使用方法:
1.定義一個類,實現(xiàn)接口Filter。
2.重寫其中的方法(執(zhí)行攔截的動作)
3.配置攔截路徑:使用注解@WebFilter或web.xml
@WebFilter("/*")//訪問所有資源之前,都會執(zhí)行該過濾器 public class FilterDemo1 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //過濾器初始化的方法,一般用于申請資源 // init:在服務(wù)器啟動后,會創(chuàng)建Filter對象,然后調(diào)用init方法。只執(zhí)行一次。用于加載資源 } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //執(zhí)行攔截的動作,具體的攔截邏輯寫在這里 //doFilter:每一次請求被攔截資源時,會執(zhí)行。執(zhí)行多次 System.out.println("filterDemo1被執(zhí)行了...."); //放行 filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { //過濾器銷毀的方法,一般用于釋放資源 //destroy:在服務(wù)器關(guān)閉后,F(xiàn)ilter對象被銷毀。如果服務(wù)器是正常關(guān)閉,則會執(zhí)行destroy方法。只執(zhí)行一次。用于釋放資源 } }
過濾器配置詳解
攔截路徑配置:
1. 具體資源路徑: /index.jsp 只有訪問index.jsp資源時,過濾器才會被執(zhí)行
2. 攔截目錄: /user/* 訪問/user下的所有資源時,過濾器都會被執(zhí)行
3. 后綴名攔截: *.jsp 訪問所有后綴名為jsp資源時,過濾器都會被執(zhí)行
4. 攔截所有資源:/* 訪問所有資源時,過濾器都會被執(zhí)行
Servlet 規(guī)范中定義的一種特殊的組件,用來監(jiān)聽 Servlet 容器產(chǎn)生的事件并進行相應的處理。
事件監(jiān)聽機制
* 事件 :一件事情
* 事件源 :事件發(fā)生的地方
* 監(jiān)聽器 :一個對象
* 注冊監(jiān)聽:將事件、事件源、監(jiān)聽器綁定在一起。 當事件源上發(fā)生某個事件后,執(zhí)行監(jiān)聽器代碼
ServletContextListener
在 ServletContext 創(chuàng)建和關(guān)閉時都會通知 ServletContextListener 監(jiān)聽器。
需要在 web.xml 里面配置監(jiān)聽器。
使用方法:
1.定義一個類,實現(xiàn)ServletContextListener接口。
2.重寫方法。
3.進行配置
ServletContextListener:監(jiān)聽ServletContext對象的創(chuàng)建和銷毀
* 方法: * void contextDestroyed(ServletContextEvent sce) :ServletContext對象被銷毀之前會調(diào)用該方法 * void contextInitialized(ServletContextEvent sce) :ServletContext對象創(chuàng)建后會調(diào)用該方法
使用Filter的登錄攔截的案例
@WebFilter("*.jsp") public class FilterTest1 implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { //判斷是否已經(jīng)登錄了,如果沒有登錄就需要跳轉(zhuǎn)到登錄界面,但是如果訪問的資源路徑本來 //就是登錄頁面,那么就不需要攔截了,這里需要進行判斷排除 //記得強制轉(zhuǎn)型 HttpServletRequest request = (HttpServletRequest)req ; //獲取session對象,看看對應的屬性是否有值 HttpSession session = request.getSession(); Object login = session.getAttribute("login"); //獲取url路徑,看看里面是否是登錄資源相關(guān)的 String requestURI = request.getRequestURI(); //在過濾掉登錄相關(guān)時,一定要排除一些js,css文件 if (login != null || requestURI.contains("/longin.jsp") || requestURI.contains("/css/") || requestURI.contains("/js/") || requestURI.contains("/fonts/") ) { chain.doFilter(req, resp); } else { request.getRequestDispatcher("/longin.jsp").forward(request, resp); } } public void init(FilterConfig config) throws ServletException { } }
感謝各位的閱讀,以上就是“JavaWeb中怎么使用Filter和Listener”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對JavaWeb中怎么使用Filter和Listener這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。