您好,登錄后才能下訂單哦!
過濾器
過濾器是處于客戶端與服務(wù)器資源文件之間的一道過濾網(wǎng),在訪問資源文件之前,通過一系列的過濾器對請求進(jìn)行修改、判斷等,把不符合規(guī)則的請求在中途攔截或修改。也可以對響應(yīng)進(jìn)行過濾,攔截或修改響應(yīng)。
如下圖,瀏覽器發(fā)出的請求先遞交給第一個filter進(jìn)行過濾,符合規(guī)則則放行,遞交給filter鏈中的下一個過濾器進(jìn)行過濾。過濾器在鏈中的順序與它在web.xml中配置的順序有關(guān),配置在前的則位于鏈的前端。當(dāng)請求通過了鏈中所有過濾器后就可以訪問資源文件了,如果不能通過,則可能在中間某個過濾器中被處理掉。
過濾器一般用于登錄權(quán)限驗證、資源訪問權(quán)限控制、敏感詞匯過濾、字符編碼轉(zhuǎn)換等等操作,便于代碼的重用,不必每個servlet中還要進(jìn)行相應(yīng)的操作。
過濾器的簡單應(yīng)用:
1、新建一個class,實現(xiàn)接口Filter(注意:是javax.servlet中的Filter)。
2、重寫過濾器的doFilter(request,response,chain)方法。另外兩個init()、destroy()方法一般不需要重寫。在doFilter方法中進(jìn)行過濾操作。
3、在web.xml中配置過濾器。這里要謹(jǐn)記一條原則:在web.xml中,監(jiān)聽器>過濾器>servlet。也就是說web.xml中監(jiān)聽器配置在過濾器之前,過濾器配置在servlet之前,否則會出錯。
<filter>
<filter-name>loginFilter</filter-name>//過濾器名稱
<filter-class>com.nnngu.filter.loginFilter</filter-class>//過濾器類的包路徑
<init—param> //可選
<param—name>參數(shù)名</param-name>//過濾器初始化參數(shù)
<param-value>參數(shù)值</param-value>
</init—pamm>
</filter>
<filter-mapping>//過濾器映射
<filter-name>loginFilter</filter-name>
<url—pattern>指定過濾器作用的范圍</url-pattern>
</filter-mapping>
<url-pattren>處定義過濾器作用的范圍。一般有以下規(guī)則:
1、作用與所有web資源:<url—pattern>/</url-pattern>。則客戶端請求訪問任意資源文件時都要經(jīng)過過濾器的過濾,通過則可以訪問,否則不能訪問。
2、作用于某一文件夾下所有文件:<url—pattern>/dir/</url-pattern>
3、作用于某一種類型的文件:<url—pattern>.擴(kuò)展名</url-pattern>。比如<url—pattern>.jsp</url-pattern>過濾所有對jsp文件的訪問請求。
4、作用于AxiTrader返傭www.fx61.com/brokerlist/axitrader.html某一文件夾下某一類型文件:<url—pattern>/dir/.擴(kuò)展名</url-pattern>
如果一個過濾器需要過濾多種文件,則可以配置多個<filter-mapping>,一個mapping定義一個url-pattern來定義過濾規(guī)則。如下:
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.nnngu.filter.loginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
例1:用過濾器實現(xiàn)登錄驗證,沒登錄則駁回訪問請求并重定向到登錄頁面。
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest) arg0;
HttpServletResponse response=(HttpServletResponse) arg1;
HttpSession session=request.getSession();
String path=request.getRequestURI();
Integer uid=(Integer)session.getAttribute("userid");
if(path.indexOf("/login.jsp")>-1){//登錄頁面不過濾
arg2.doFilter(arg0, arg1);//遞交給下一個過濾器
return;
}
if(path.indexOf("/register.jsp")>-1){//注冊頁面不過濾
arg2.doFilter(request, response);
return;
}
if(uid!=null){//已經(jīng)登錄
arg2.doFilter(request, response);//放行,遞交給下一個過濾器
}else{
response.sendRedirect("login.jsp");
}
}
例2:設(shè)置字符編碼
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request2=(HttpServletRequest) request;
HttpServletResponse response2=(HttpServletResponse) response;
request2.setCharacterEncoding("UTF-8");
response2.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
創(chuàng)建Filter
創(chuàng)建一個類然后實現(xiàn)Filter
注意:
? ? ? 導(dǎo)入的包是javax.servlet.Filter下的包
? ? ? 初始化init是再啟動tomcat的時候進(jìn)行初始化的
? ? ? doFilter中的chain.doFilter是放行的方法
建議把doFilter中的request和response轉(zhuǎn)換為帶協(xié)議的HttpServletRequset和HttpServletResponse
因為帶協(xié)議的Http是不帶協(xié)議的子類,里面的方法比父類更豐富,方便后面調(diào)用方法
下面是創(chuàng)建Filter的實例代碼
package cn._02FilterChain;
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;@WebFilter("/chain")
br/>@WebFilter("/chain")
br/>@Override
// TODO Auto-generated method stub}
@Override
br/>}
@Override
throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse resp=(HttpServletResponse) response;
System.out.println("A放行之前+++");
chain.doFilter(req, resp);System.out.println("A放行之后---");
}
@Override
br/>System.out.println("A放行之后---");
}
@Override
// TODO Auto-generated method stub}
}
Filter再web.xml中的配置
配置方式有
1.再web.xml中進(jìn)行配置
2.再類中加上@WebFilter("攔截路徑");
br/>}
}
Filter再web.xml中的配置
配置方式有
1.再web.xml中進(jìn)行配置
2.再類中加上@WebFilter("攔截路徑");
? ? ? ?調(diào)用方式是按照配置的<filter-mapping>來調(diào)用的
下面是web.xml的實例代碼
<filter>
<filter-name>chainA</filter-name>
<filter-class>cn._02FilterChain.AFilter</filter-class>
</filter>
<filter>
<filter-name>chainB</filter-name>
<filter-class>cn._02FilterChain.BFilter</filter-class>
</filter>
<filter>
<filter-name>chainC</filter-name>
<filter-class>cn._02FilterChain.CFilter</filter-class>
</filter>
<!-- 執(zhí)行順序按照filter-mapping執(zhí)行 -->
<filter-mapping>
<filter-name>chainB</filter-name>
<url-pattern>/chain</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>chainA</filter-name>
<url-pattern>/chain</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>chainC</filter-name>
<url-pattern>/chain</url-pattern>
</filter-mapping>
package com.zzxtit.common.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;
public class CharacterEncodingFilter implements Filter{
private static String encoding = "UTF-8";
public void init(FilterConfig filterConfig) throws ServletException {
encoding = filterConfig.getInitParameter("encoding") == null ? "UTF-8" : filterConfig.getInitParameter("encoding");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding(encoding);
}
}
注 :
(1)使用getInitPamater是從web.xml里獲取變量enciding的默認(rèn)值
(2)chain的作用 :一般filter都是一個鏈,web.xml里配置了幾個就有幾個。一個一個連在一起,chain.doFilter()將請求轉(zhuǎn)發(fā)給過濾器鏈下一個filter
代碼實現(xiàn)
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.zzxtit.common.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。