1.Filter的創建
定義一個類讓其實現Filter接口
2.Filter的設置
在doFilter()方法中加入相應的攔截代碼,加入了相應的攔截代碼之後需要使用chain.doFilter(req,resp)讓請求繼續走
3.Filter的配置
在web.xml中進行配置
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>org.itat.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
url-pattern表示要攔截哪些請求:/
·/* :表示攔截所有請求
·/01/1.jsp : 表示僅僅只對01/1.jsp文件進行攔截
·/01/* : 表示攔截01/這個文件夾中的所有信息
特別注意:/01/*.jsp這種方式是不允許的,只允許以上三種方式
4.使用過濾器解決字符編碼
定義一個CharacterEncodingFilter,在doFilter中使用request.setCharacterEncoding(xxx);來解決
注意:當有多個Filter被定義的時候會每一個filter都執行,執行順序按照web.xml中配置先後執行
爲了讓一些常量在配置文件中定義,可以使用
<filter>
<filter-name>CharacterFilter</filter-name>
<filter-class>org.itat.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>Char</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
init-param就是用來定義相應的初始化參數,需要在Filter的init中通過config來獲取
@Override
public void init(FilterConfig config) throws ServletException {
charEncoding = config.getInitParameter("Char");//獲取初始化參數
if(charEncoding==null||"".equals(charEncoding)) {
charEncoding = "UTF-8";
}
}
charEncoding需要在doFilter中使用,所以將charEncoding定義成成員變量。
request.setCharacterEncoding(charEncoding);
chain.doFilter(request,response);
使用過濾器根據正則表達式過濾訪問地址
1、在初始化參數中傳遞一個正則表達式
<init-param>
<param-name>pattern</param-name>
<param-value>.*\.jsp|.*Servlet</param-value>
</init-param>
.*.jsp|.*Servlet表示匹配.jsp結尾和Servlet結尾的所有字符串
2、獲取瀏覽器的訪問地址
HttpServletRequest req = (HttpServletRequest)request;
String url = req.getRequestURI();//獲取瀏覽器的訪問地址
//參數中是ServletRequest,ServletRequest中沒有getRequestURI方法,getRequetURL方法是在HttpServletRequest中,所以需要進行強制類型轉換(HttpServletRequest req = (HttpServletRequest)request;)。
3、判斷是否匹配
if(url.matches(pattern)) {
System.out.println(url);
System.out.println(url.matches(pattern));
request.setCharacterEncoding(charEncoding);//修改字符編碼
}