一、什麼是過濾器:
政府大樓的安檢保安,它既能對進入政府大樓的人員進行檢查,隻允許檢查符合要求的進入;同時他也負責對出大樓的人進行檢查,看他帶出的東西是否符合要求。
同樣的,Servlet中的過濾器既可以對用戶端發來的請求,在Servlet接收之前進行過濾;也可以對Servlet發出的響應,在用戶端接收之前進行過濾。
二、過濾器的實作:
Servlet的過濾器是通過實作javax.servlet.Filter接口實作的。(也就是說Servlet過濾器其實就是一個實作了Filter的Serlvet類)。該接口有三個方法:
init(FilterConfig filterConfig)
Servlet的初始化方法:讀取web.xml中配置的Filter的初始化參數(它的參數提供了filterConfig對象,該對象可以讀取web.xml裡的配置)。init()隻會被調用一次。
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//擷取Filter初始化參數
String username = filterConfig.getInitParameter("username");
}
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
Servlet的過濾方法:當用戶端的請求的符合被過濾的範圍時,該方法進行過濾處理。處理完後chain再調用doFilter(request,response),表示繼續執行下一個過濾器。
(這裡的ServletRequest和ServletResponse都要強制轉換成HttpSevletRequest和HttpServletResponse,因為Servlet實作的請求和響應式Http類型的。)
destroy()
Servlet容器在銷毀過濾器執行個體前調用該方法,在該方法中釋放Servlet過濾器占用的資源。
三、在web.xml中配置Filter:
注意:一般Filter都是配置在Servlet之前的。
過濾器中init(FilterConfig filterConfig)就是用來擷取配置的這些資訊,初始化過濾器的。
<filter>
<filter-name>LoginFilter</filter-name> //過濾器的名字
<filter-class>com.itzhai.login.LoginFilter</filter-class> //過濾器類名
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern> //要過濾的url
</filter-mapping>
四、過濾敏感詞的過濾器例子:
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//轉換成執行個體的請求和響應對象
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
//擷取評論并屏蔽關鍵字
String comment = req.getParameter("comment");
comment = comment.replace("A", "***");
//重新設定參數
req.setAttribute("comment", comment);
//繼續執行
chain.doFilter(request, response);
}
轉載于:https://www.cnblogs.com/wangerxiansheng/p/4122934.html