JavaWeb之Filter和Listener
Filter:過濾器
執行流程:
使用方法:
過濾器配置詳解
Listener:監聽器
事件監聽機制
ServletContextListener
使用方法:
使用Filter的登錄攔截的案例
Filter:過濾器
過濾器:當訪問服務器的資源時,過濾器可以將請求攔截下來,完成一些特殊的功能,一般用于完成通用的操作,如:登錄驗證、統一編碼處理、敏感字符過濾...
過濾器相當于瀏覽器與 Web 資源之間的一道過濾網,在訪問資源之前通過一系列的過濾器對請求進行修改、判斷以及攔截等,也可以對回應進行修改、判斷以及攔截等,
執行流程:
-
客戶端發出請求,先經過過濾器, 如果過濾器放行,那么才能到servlet
-
如果有多個過濾器, 那么他們會按照注冊的映射順序 來 排隊, 只要有一個過濾器, 不放行,那么后面排隊的過濾器以及咱們的servlet都不會收到請求,
使用方法:
1.定義一個類,實作介面Filter,
2.重寫其中的方法(執行攔截的動作)
3.配置攔截路徑:使用注解@WebFilter或web.xml
@WebFilter("/*")//訪問所有資源之前,都會執行該過濾器
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//過濾器初始化的方法,一般用于申請資源
// init:在服務器啟動后,會創建Filter物件,然后呼叫init方法,只執行一次,用于加載資源
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//執行攔截的動作,具體的攔截邏輯寫在這里
//doFilter:每一次請求被攔截資源時,會執行,執行多次
System.out.println("filterDemo1被執行了....");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
//過濾器銷毀的方法,一般用于釋放資源
//destroy:在服務器關閉后,Filter物件被銷毀,如果服務器是正常關閉,則會執行destroy方法,只執行一次,用于釋放資源
}
}
過濾器配置詳解
攔截路徑配置:
1. 具體資源路徑: /index.jsp 只有訪問index.jsp資源時,過濾器才會被執行
2. 攔截目錄: /user/* 訪問/user下的所有資源時,過濾器都會被執行
3. 后綴名攔截: *.jsp 訪問所有后綴名為jsp資源時,過濾器都會被執行
4. 攔截所有資源:/* 訪問所有資源時,過濾器都會被執行
Listener:監聽器
Servlet 規范中定義的一種特殊的組件,用來監聽 Servlet 容器產生的事件并進行相應的處理,
事件監聽機制
* 事件 :一件事情
* 事件源 :事件發生的地方
* 監聽器 :一個物件
* 注冊監聽:將事件、事件源、監聽器系結在一起, 當事件源上發生某個事件后,執行監聽器代碼
ServletContextListener
在 ServletContext 創建和關閉時都會通知 ServletContextListener 監聽器,
需要在 web.xml 里面配置監聽器,
使用方法:
1.定義一個類,實作ServletContextListener介面,
2.重寫方法,
3.進行配置
ServletContextListener:監聽ServletContext物件的創建和銷毀
* 方法:
* void contextDestroyed(ServletContextEvent sce) :ServletContext物件被銷毀之前會呼叫該方法
* void contextInitialized(ServletContextEvent sce) :ServletContext物件創建后會呼叫該方法
使用Filter的登錄攔截的案例
@WebFilter("*.jsp")
public class FilterTest1 implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//判斷是否已經登錄了,如果沒有登錄就需要跳轉到登錄界面,但是如果訪問的資源路徑本來
//就是登錄頁面,那么就不需要攔截了,這里需要進行判斷排除
//記得強制轉型
HttpServletRequest request = (HttpServletRequest)req ;
//獲取session物件,看看對應的屬性是否有值
HttpSession session = request.getSession();
Object login = session.getAttribute("login");
//獲取url路徑,看看里面是否是登錄資源相關的
String requestURI = request.getRequestURI();
//在過濾掉登錄相關時,一定要排除一些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 {
}
}
創作不易,如果本篇博客對您有一定的幫助,大家記得留言+點贊哦,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/267079.html
標籤:java
