Filter

Filter
攔截每個網(wǎng)頁的請求,看看你是否登錄過
一.Hello Filter
1.Filter概念
Filter就像一個一個哨卡,用戶的請求需要經(jīng)過Filter,并且可以有多個過濾器
用戶訪問--Filter1-Filter2-Filter3-->Servlet
2.編寫FirstFilter
開發(fā)一個簡單的FirstFilter

public class FirstFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request =(HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse) res;
//瀏覽器所處的客戶機(jī)的ip地址
String ip=request.getRemoteAddr();
//瀏覽器發(fā)送請求的資源名部分,去掉協(xié)議和主機(jī)名
String url=request.getRequestURI().toString();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d=new Date();
String date=sdf.format(d);
//控制臺打印出來
System.out.printf("%s %s 訪問了 %s%n",date,ip,url);

//過濾器放行,表示繼續(xù)運行下一個過濾器,或者最終訪問的某個servlet,jsp,html等
chain.doFilter(request, response);
}

@Override
public void init(FilterConfig arg0) throws ServletException {
    // TODO Auto-generated method stub
    System.out.println("First Filter init()");
}

}
3.配置web.xml
filter>
<filter-name>FirstFilter</filter-name>
<filter-class>filter.FirstFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.訪問頁面
5.init()方法
與Servlet需要配置自啟動才會隨著tomcat的啟動而執(zhí)行init()方法不一樣
Filter一定會隨著tomcat的啟動自啟動
6.Filter啟動失敗
Filter是web應(yīng)用非常重要的一個環(huán)節(jié),如果Filter啟動失敗,或者本身有編譯錯誤,不僅這個Filter不能使用,整個web應(yīng)用會啟動失敗,導(dǎo)致用戶無法訪問頁面
在啟動tomcat過程中,也會看到這樣的字樣:
嚴(yán)重: Context [] startup failed due to previous errors

二.中文處理
1.使用Servlet處理的局限性
在通過Servlet獲取中文參數(shù) 的章節(jié)中知道,可以通過 request.setCharacterEncoding("UTF-8");
正確獲取UTF-8編碼的中文,但是如果有很多servlet都需要獲取中文,那么就必須在每個Servlet中增加這段代碼。有一個簡便的辦法,通過Filter過濾器進(jìn)行中文處理 ,所有的Servlet都不需要單獨處理了。
2.使用Filter處理
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;

    request.setCharacterEncoding("UTF-8");
    chain.doFilter(request, response);
}

3.配置web.xml
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>filter.EncodingFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.測試

三.登錄驗證
1.在Servlet中進(jìn)行登陸驗證的局限性
我們可以通過在HeroListServlet中增加對session的判斷代碼來做到登錄驗證,但是按照這樣的做法,所有的Servlet都要加上一樣的代碼,通過Filter一次性解決所有的登錄驗證的問題

//如果訪問的資源是以css或者js結(jié)尾的,那么就不需要判斷是否登錄
if (uri.endsWith(".css") || uri.endsWith(".js")) {
chain.doFilter(request, response);
return;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容