1. 程式人生 > >JAVA Web基礎4-過濾器與監聽器

JAVA Web基礎4-過濾器與監聽器

javax 數組 patch param object servle on() .get 監聽器

一.過濾器
1.定義:過濾器是指定義在服務器端的一段程序, 可以截獲客戶端發來的請求, 並根據一定規則進行過濾和攔截。
2.過濾器的生命周期:
1.服務器啟動:先通過web.xml加載過濾器進行實例化(這個過程是調用過濾器中init()方法, 同樣也是只執行一次);
2.客戶端發送請求:執行過濾器中的doFilter()方法, 這個方法會執行N次, 每次有請求發送過來, 都會執行這個方法進行過濾;
3.銷毀過程:同servlet, 關閉或者停止服務器的時候會執行destroy()方法;
3.過濾器鏈:
不同的請求互不影響,過濾器鏈主要是針對多個過濾器過濾同一個url請求,過濾器的先後順序是按照在web.xml的配置順序來的;


運行順序: 請求--->過濾器1過濾--->過濾器2過濾--->後臺處理層--->過濾器2過濾--->過濾器1過濾--->客戶端接收
4.在web.xml中配置過濾器:

<filter>
	<filter-name>Myfilter</filter-name>
	<filter-class>com.hanqi.filter.Myfilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>Myfilter</filter-name>
	<url-pattern>/Testfilter</url-pattern><!-- 指哪些請求可以被過濾 -->
</filter-mapping>

5.過濾器應用示例:檢測當前用戶是否有效。

package com.hanqi.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter(value = "/*", initParams = { @WebInitParam(name = "page", value = "Login,Register,index,.js") })
public class SessionFilter implements Filter {
	private String[] page;
	//構造方法
	public SessionFilter() {
		
	}
	//銷毀方法,以便釋放資源
	public void destroy() {
		
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest request1 = (HttpServletRequest) request;//HttpServletRequest是ServletRequest的子類,可以強轉獲得request
		HttpServletResponse response1 = (HttpServletResponse) response;
		String url = request1.getRequestURI();//獲取請求路徑
		if (checkUrl(url)) {
			chain.doFilter(request1, response1);//對請求進行放行
		} else {
			Object o = request1.getSession().getAttribute("currentUser");
			if (o == null) {
				request.setAttribute("errmsg", "用戶名已失效!");
				request.getRequestDispatcher("/WEB-INF/page/login.jsp").forward(request, response);
			} else {
				chain.doFilter(request1, response1);
			}
		}

	}
	//過濾器初始化時會調用該方法
	public void init(FilterConfig fConfig) throws ServletException {
		String pages = fConfig.getInitParameter("page");//獲取初始化參數值
		this.page = pages.split(",");
		System.out.println(pages);
	}

	public boolean checkUrl(String url) {
		for (String p : page) {
			if (url.contains(p)) {
				return true;
			}
		}
		return false;
	}
}

6.關於註解:
在新版本(從Web2.5開始)中可以使用註解代替在web.xml中配置對象。
格式:@註解("屬性值"),其等同於@註解(屬性="屬性值")例:@WebFilter("/*")或@WebFilter(value="/*")
帶參數的格式:@WebFilter(filterName="Myfilter",value="/*",initParams= {@WebInitParam(name="",value="")})
註意:value和urlPatterns都可以用來聲明過濾的請求, 也同樣都可以使用數組的形式定義, 但是這兩個屬性不能同時使用, 否則會報java.lang.IllegalArgumentException異常而無法啟動Tomcat服務器;

JAVA Web基礎4-過濾器與監聽器