當(dāng)需要限制用戶訪問某些資源或者在處理請求時(shí)提前處理某些資源時(shí)就缆,即可使用過濾器完成涎永。
1涯保、過濾器的基本概念
** 過濾器**晒来,是一個(gè)服務(wù)器端的組件钞诡,它可以截取用戶端的請求域響應(yīng)信息,并對這些信息過濾湃崩。
過濾器是以一種組件的形式綁定到Web應(yīng)用程序當(dāng)中的荧降,與其他的Web用用程序組件不同的是,過濾器是采用“鏈”的方式進(jìn)行處理攒读。
2朵诫、過濾器的工作原理
在沒有使用過濾器以前,客戶端都是直接請求Web資源的薄扁,但是一旦加入了過濾器剪返,所有的請求都是先交給了過濾器處理,然后再訪問相應(yīng)的Web資源邓梅,可以達(dá)到對某些資源的訪問限制随夸。
3、過濾器的生命周期
實(shí)例化和初始化都只執(zhí)行一次震放。
4宾毒、實(shí)現(xiàn)過濾器
定義一個(gè)過濾器,直接讓一個(gè)類實(shí)現(xiàn)javax.servlet.Filter接口即可殿遂。并覆寫相應(yīng)的方法诈铛,所有的過濾器要執(zhí)行兩次。
此接口定義了3個(gè)操作方法:
public void init(FilterConfig filterConfig) throws ServletException
這是過濾器的初始化方法墨礁,Web容器創(chuàng)建過濾器實(shí)例化后將調(diào)用這個(gè)方法幢竹,這個(gè)方法中可以讀取web.xml文件中過濾器的參數(shù)。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException ServletException
這個(gè)方法完成實(shí)際的過濾操作恩静,這個(gè)是過濾器的核心方法焕毫,當(dāng)用戶請求訪問與過濾器關(guān)聯(lián)的URL時(shí),Web容器將先調(diào)用過濾器的doFilter()方法驶乾。
FilterChain參數(shù)可以調(diào)用chain.doFilter()方法邑飒,將請求傳給下一個(gè)過濾器(或目標(biāo)資源),或利用轉(zhuǎn)發(fā)级乐、重定向?qū)⒄埱筠D(zhuǎn)發(fā)到其他資源疙咸。
public void destroy()
Web容器在銷毀過濾器銷毀實(shí)例前調(diào)用該方法,在這個(gè)方法中可以釋放過濾器占用的資源风科。(大多數(shù)情況用不到)
需要配置web.xml撒轮,配置與Servlet的配置時(shí)非常的類似芙代。
<filter>
<filter-name>SimpleFilter</filter-name>
<filter-class>com.meng.filter.SimpleFilter</filter-class>
<init-param>
<description>描述信息</description>
<param-name>name</param-name>
<param-value>xiaoli</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SimpleFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher></dispatcher>
</filter-mapping>
<url-pattern>表示過濾器的過濾(路徑)位置欧穴。
<dispatcher>定義過濾器的分類類型改艇。
過濾器能改變用戶請求的Web資源焊唬,也就是能改變用戶請求的路徑。
過濾器不能直接返回?cái)?shù)據(jù)顶瞳,不能直接處理用戶請求亲桦。
5、過濾器鏈
服務(wù)器會按照在web.xml中過濾器定義的先后順序組裝成一條鏈浊仆。
6客峭、過濾器分類
在Servlet3.0中加入了@WebFilter
@WebFilter 用于將一個(gè)類聲明為過濾器,該注解將會在部署時(shí)被容器處理抡柿,容器將根據(jù)具體的屬性配置將相應(yīng)的類部署為過濾器舔琅。
@WebFilter(servletNames={"SimpleServlet"},filterName="SimpleFilter")
public class SimpleFilter implements Filter {
.........
}
注解的方式等同于
<filter>
<filter-name>SimpleFilter</filter-name>
<filter-class>com.meng.filter.SimpleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SimpleFilter</filter-name>
<servlet-name>SimpleServlet</servlet-name>
</filter-mapping>
7、過濾器應(yīng)用
過濾器在實(shí)際應(yīng)用中的一些場景:
- 對用戶請求進(jìn)行統(tǒng)一認(rèn)證
- 編碼轉(zhuǎn)換
- 對用戶發(fā)送的數(shù)據(jù)進(jìn)行過濾替換
- 轉(zhuǎn)換圖像格式
- 對相應(yīng)的內(nèi)容進(jìn)行壓縮
- 等等洲劣。备蚓。。囱稽。
案例一:編碼轉(zhuǎn)換
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;
public class EncodingFilter implements Filter {
private String charSet;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 設(shè)置統(tǒng)一編碼
request.setCharacterEncoding(this.charSet);
}
@Override
public void init(FilterConfig config) throws ServletException {
// 取得初始化的參數(shù)
this.charSet = config.getInitParameter("charset");
}
}
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.meng.filter.EncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
案例二:登錄驗(yàn)證
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.HttpSession;
public class LoginFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpSession session = req.getSession();
if (session.getAttribute("userid") != null ) {
chain.doFilter(request, response);
} else {
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
@Override
public void init(FilterConfig config) throws ServletException {
}
}