java web編程學習3

此次要學習的是filter。紅薯提供我又進行了些更改的hellofilter代碼以下:java

package demo;

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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.core.ActionHandler;
import com.core.Config;
import com.core.Handler;

public class HelloFilter implements Filter {
	private Handler handler;
	@Override
	public void init(FilterConfig arg0) throws ServletException {
		System.out.println("Filter 初始化");
		Config.cns.add("Blog");
		handler = new ActionHandler();
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest)req;
		System.out.println("攔截 URI="+request.getRequestURI());
		String coname = request.getParameter("c");
		System.out.println(request.getParameter("c") + Config.cns.contains(request.getParameter("c")));
		if(Config.cns.contains(coname)) {
			handler.handle((HttpServletResponse)res, request);
		}
		else {
			chain.doFilter(req, res);
		}
	}

	@Override
	public void destroy() {
		System.out.println("Filter 結束");
	}
}

 web

HelloFilter實現了Filter接口,Filter定義了三個方法:tomcat

image

當咱們啓動tomcat後客戶端還未訪問的時候,控制檯便輸出瞭如下信息框架

image

控制檯輸出了」Filter 初始化」,即tomcat會自動初始化咱們在web.xml註冊的filter,即調用了init()方法。ide

當客戶端訪問 http://localhost:8080/hello.view 之後,控制檯輸出:學習

image

也就是說訪問了一次,tomcat在執行某個servlet前會調用doFilter,因此咱們須要將filter交給框架指定的filter類(試了試osc上很熱門的jfinal,很不錯),這樣整個工程就會交給框架託管了。doFilter有三個參數,ServletRequest、ServletResponse和FilterChain。.net

ServletRequest、ServletResponse這兩個參數想來確定就是傳給servlet那個public的service方法了。至於FilterChain,字面的意思就是過濾鏈了,若是咱們在web.xml註冊了多個Filter的話,就會帶着ServletRequest、ServletResponse去執行下個Filter的dofilter方法。在這個案例,因爲咱們只有一個Filter,因此就去執行具體的servlet方法了。日誌

Filter能夠攔截下http請求,咱們能夠在這裏能夠作些額外的工做,好比判斷用戶是否登錄啊等等,固然我也沒有具體作過開發,沒什麼發言權,但願有人給點指點,讓我理解得更好點。code

至於destory方法,和init方法同樣也是由web容器調用的,當服務結束的時候調用,但是每次我關閉tomcat的時候,因爲小黑窗關得太快,我都看不到啊,怎麼寫進日誌裏呢,求大神指點。xml

相關文章
相關標籤/搜索