Elastic AMP監控.NET程式效能
Filter
Servlet, Filter, Listener稱為Java Web的三大元件
Filter: 過濾器
當瀏覽器訪問伺服器資源時和響應返回時,過濾器可以將請求攔截下來,完成一些特殊功能
用途:一般用於完成通用操作:如登入驗證,統一編碼處理,敏感字元過濾…
1. Filter實現
- 定義一個類,實現Filter介面
- 覆寫方法
- 配置攔截路徑
- 配置WEB-INF中的xml
- 用註解配置路徑:@WebFilter(urlPatterns=””)或@WebFilter(value=””)或@WebFilter(””)
2. Filter原理
- Filter執行流程
- 請求過濾:執行放行doFilter上的程式碼
- 放行:執行doFilter,攔截的資源被執行
- 響應過濾:攔截的資源做出響應後,回來執行doFilter下邊的程式碼
- Filter生命週期
- init():初始化
在伺服器啟動後,建立Filter物件,執行init方法。
只執行一次。一般用於載入資源。
- doFilter():請求過濾,響應過濾。
- destroy():銷燬
在伺服器正常關閉時呼叫,一般用於釋放資源
- init():初始化
- 過濾器攔截路徑
- 攔截資源:/index.jsp, /loginServlet
只有訪問具體資源時,過濾器才會被執行
2.攔截目錄:/user/*
只有訪問/user下的資源時,過濾器才會被執行
3.字尾名攔截:*.jsp (沒有/)
4. 攔截所有資源:/*
- 過濾器的攔截方式:資源的訪問方式
- 註解配置:配置dispatcherType屬性
- REQUEST: 預設值,資源被瀏覽器直接訪問時,才被攔截
- FORWARD: 轉發訪問這個資源時,才被攔截
- INCLUDE:包含訪問資源時,才被攔截
- ASYNC:非同步訪問資源時,才被攔截
@WebFilter(dispatcherType={DispatcherType.REQUEST, DispatcherType.FORWARD});
2. xml配置
- 攔截鏈
- 執行順序:請求過濾按先後順序由小到大執行,響應順序則正好相反
All filter... (@WebFilter(/*))
hello Filter... (@WebFilter(/hello.jsp))
你好,JSP (hello.jsp)
hello Filter back...
All filter…
2. 過濾器的先後順序
* 註解配置:- 按字串比較規則,由小到大執行。
如:/*先於/login.jsp執行
- 如果有重複,則從小到大覆蓋執行
如:/* 和 /login.jsp在請求login.js時都執行過濾
* web.xml配置:誰在上,誰先執行
- 登入案例
- 訪問案例的資源。驗證其是否登入
- 如果登入了,則直接放行。
- 如果沒有登入,則跳轉到登入頁面,提示"您尚未登入,請先登入"。
@WebFilter("/*") public class LoginFilter implements Filter { @Override public void init(FilterConfig config) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { HttpServletRequest request1=(HttpServletRequest) request; String uri=request1.getRequestURI(); //注意:要過濾資源,否則樣式和字型等login的資源不顯示 if(uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/") || uri.contains("/fonts/") || uri.contains("/js/") || uri.contains("/checkCodeServlet")) { chain.doFilter(request, response); } else { String userName= (String) request1.getSession().getAttribute("username"); if(null != userName && !"".equals(userName)) { chain.doFilter(request, response); }else { request.setAttribute("loginMsg","您未登入,請登入!"); request.getRequestDispatcher("/hellouser/login.jsp").forward(request, response); } } } }