javaEE學習筆記————Filter、Listener小總結

1.Filter:過濾器

1.1. 概念:

	 生活中的過濾器:淨水器,空氣淨化器
	 web中的過濾器:當訪問服務器的資源時,過濾器可以將請求攔截下來,完成一些特殊的功能。
	 過濾器的作用:
		一般用於完成通用的操作。如:登錄驗證、統一編碼處理、敏感字符過濾...

1.2. 快速入門:

	1. 步驟:
		1. 定義一個類,實現接口Filter
		2. 複寫方法
		3. 配置攔截路徑
			1. web.xml
			2. 註解
	2. 代碼:
		@WebFilter("/*")//訪問所有資源之前,都會執行該過濾器
		public class FilterDemo1 implements Filter {
		    @Override
		    public void init(FilterConfig filterConfig) throws ServletException {
		
		    }
		
		    @Override
		    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
		        System.out.println("filterDemo1被執行了....");
		
		
		        //放行
		        filterChain.doFilter(servletRequest,servletResponse);
		
		    }
		
		    @Override
		    public void destroy() {
		
		    }
		}

1.3. 過濾器細節:

	1. web.xml配置	
		<filter>
	        <filter-name>demo1</filter-name>
	        <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
	    </filter>
	    <filter-mapping>
	        <filter-name>demo1</filter-name>
			<!-- 攔截路徑 -->
	        <url-pattern>/*</url-pattern>
	    </filter-mapping>
	2. 過濾器執行流程
		1. 執行過濾器
		2. 執行放行後的資源
		3. 回來執行過濾器放行代碼下邊的代碼
	3. 過濾器生命週期方法
		1. init:在服務器啓動後,會創建Filter對象,然後調用init方法。只執行一次。用於加載資源
		2. doFilter:每一次請求被攔截資源時,會執行。執行多次
		3. destroy:在服務器關閉後,Filter對象被銷燬。如果服務器是正常關閉,則會執行destroy方法。只執行一次。用於釋放資源
	4. 過濾器配置詳解
		*攔截路徑配置:
			1. 具體資源路徑: /index.jsp   只有訪問index.jsp資源時,過濾器纔會被執行
			2. 攔截目錄: /user/*	訪問/user下的所有資源時,過濾器都會被執行
			3. 後綴名攔截: *.jsp		訪問所有後綴名爲jsp資源時,過濾器都會被執行
			4. 攔截所有資源:/*		訪問所有資源時,過濾器都會被執行
		攔截方式配置:資源被訪問的方式
			註解配置:
				設置dispatcherTypes屬性
					1. REQUEST:默認值。瀏覽器直接請求資源
					2. FORWARD:轉發訪問資源
					3. INCLUDE:包含訪問資源
					4. ERROR:錯誤跳轉資源
					5. ASYNC:異步訪問資源
			 web.xml配置
				設置<dispatcher></dispatcher>標籤即可
			
	5. 過濾器鏈(配置多個過濾器)
		執行順序:如果有兩個過濾器:過濾器1和過濾器2
			1. 過濾器1
			2. 過濾器2
			3. 資源執行
			4. 過濾器2
			5. 過濾器1 

		過濾器先後順序問題:
			1. 註解配置:按照類名的字符串比較規則比較,值小的先執行
				如: AFilter 和 BFilter,AFilter就先執行了。
			2. web.xml配置: <filter-mapping>誰定義在上邊,誰先執行

1.4. 案例:

  1. 案例1_登錄驗證
    需求:
    1. 訪問day17_case案例的資源。驗證其是否登錄
    2. 如果登錄了,則直接放行。
    3. 如果沒有登錄,則跳轉到登錄頁面,提示"您尚未登錄,請先登錄"。
**
 * 登錄驗證的過濾器
 */
@WebFilter("/*")
public class LoginFilter implements Filter {


    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //System.out.println(req);
        //0.強制轉換
        HttpServletRequest request = (HttpServletRequest) req;

        //1.獲取資源請求路徑
        String uri = request.getRequestURI();
        //2.判斷是否包含登錄相關資源路徑,要注意排除掉 css/js/圖片/驗證碼等資源
        if(uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/") || uri.contains("/js/") || uri.contains("/fonts/") || uri.contains("/checkCodeServlet")  ){
            //包含,用戶就是想登錄。放行
            chain.doFilter(req, resp);
        }else{
            //不包含,需要驗證用戶是否登錄
            //3.從獲取session中獲取user
            Object user = request.getSession().getAttribute("user");
            if(user != null){
                //登錄了。放行
                chain.doFilter(req, resp);
            }else{
                //沒有登錄。跳轉登錄頁面

                request.setAttribute("login_msg","您尚未登錄,請登錄");
                request.getRequestDispatcher("/login.jsp").forward(request,resp);
            }
        }


        // chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

    public void destroy() {
    }

}

效果:我訪問的是分頁的servlet,沒有登錄就返回到了登錄頁面

在這裏插入圖片描述

  1. 案例2_敏感詞彙過濾,點擊鏈接跳轉
    過濾敏感詞彙

2.Listener:監聽器

概念:web的三大組件之一。
	事件監聽機制
		事件	:一件事情
		事件源 :事件發生的地方
		監聽器 :一個對象
		註冊監聽:將事件、事件源、監聽器綁定在一起。 當事件源上發生某個事件後,執行監聽器代碼


ServletContextListener:監聽ServletContext對象的創建和銷燬
	方法:
		void contextDestroyed(ServletContextEvent sce) :ServletContext對象被銷燬之前會調用該方法
		void contextInitialized(ServletContextEvent sce) :ServletContext對象創建後會調用該方法
	步驟:
		1. 定義一個類,實現ServletContextListener接口
		2. 複寫方法
		3. 配置
			1. web.xml
					<listener>
 					 <listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
					</listener>

					指定初始化參數<context-param>
			2. 註解:
				@WebListener

2.1代碼示例

@WebListener
public class ContextLoaderListener implements ServletContextListener {

    /**
     * 監聽ServletContext對象創建的。ServletContext對象服務器啓動後自動創建。
     *
     * 在服務器啓動後自動調用
     * @param servletContextEvent
     */
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //加載資源文件
        //1.獲取ServletContext對象
        ServletContext servletContext = servletContextEvent.getServletContext();

        //2.加載資源文件
        String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");

        //3.獲取真實路徑
        String realPath = servletContext.getRealPath(contextConfigLocation);

        //4.加載進內存
        try{
            FileInputStream fis = new FileInputStream(realPath);
            System.out.println(fis);
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("ServletContext對象被創建了。。。");
    }

    /**
     * 在服務器關閉後,ServletContext對象被銷燬。當服務器正常關閉後該方法被調用
     * @param servletContextEvent
     */
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext對象被銷燬了。。。");
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章