一、定義

應用場景
自動登入
統一設定編碼格式
通路權限控制
敏感字元過濾等
二、建立Filter
1、配置web.xml
<filter>
<filter-name>first</filter-name>
<filter-class>net.pp.Filter.FirstFilter</filter-class>
<init-param>
<param-name>param</param-name>
<param-value>value</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>first</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
2、實作Filter接口
FirstFilter.java
package net.pp.Filter;
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 java.io.IOException;
public class FirstFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String filterName = filterConfig.getFilterName();
String initParameter = filterConfig.getInitParameter("param");
ServletContext servletContext = filterConfig.getServletContext();
System.out.println(filterName+"--"+initParameter);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("FirstFilter已經執行攔截!");
//解除攔截
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
3、在Servlet中測試
TestFilter
package net.pp.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "TestServlet" ,urlPatterns = "/testFilter")
public class TestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("test/html;charset=utf-8");
response.getWriter().write("testFilter已經被通路了!");
}
}
結果:
三、配置Filter
1)url-Pattern配置
配置要攔截的資源
- 以指定資源比對。例如
"/index.jsp"
- 以目錄比對。例如
"/servlet/*"
- 以字尾名比對,例如
"*.jsp"
- 通配符,攔截所有web資源。
"/*"
<filter-mapping>
<filter-name>first</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
2)dispatcherTypes **
配置攔截的類型,可配置多個。
FORWARD,//轉發的
INCLUDE,//包含在頁面的
REQUEST,//請求的
ASYNC,//異步的
ERROR;//出錯的
3)注解方式配置
package filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;
@WebFilter(filterName = "CharsetFilter",
urlPatterns = "/*",/*通配符(*)表示對所有的web資源進行攔截*/
initParams = {
@WebInitParam(name = "charset", value = "utf-8")/*這裡可以放一些初始化的參數*/
})
public class CharsetFilter implements Filter {
private String filterName;
private String charset;
public void destroy() {
/*銷毀時調用*/
System.out.println(filterName + "銷毀");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
/*過濾方法 主要是對request和response進行一些處理,然後交給下一個過濾器或Servlet處理*/
System.out.println(filterName + "doFilter()");
req.setCharacterEncoding(charset);
resp.setCharacterEncoding(charset);
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
/*初始化方法 接收一個FilterConfig類型的參數 該參數是對Filter的一些配置*/
filterName = config.getFilterName();
charset = config.getInitParameter("charset");
System.out.println("過濾器名稱:" + filterName);
System.out.println("字元集編碼:" + charset);
}
}
多個Filter的執行順序
在我們的請求到達Servle之間是可以經過多個Filter的,一般來說,建議Filter之間不要有關聯,各自處理各自的邏輯即可。
如果一定要確定執行順序,就要對配置進行修改了,執行順序如下
在web.xml中,filter執行順序跟<filter-mapping>的順序有關,先聲明的先執行
使用注解配置的話,filter的執行順序跟名稱的字母順序有關,例如AFilter會比BFilter先執行
如果既有在web.xml中聲明的Filter,也有通過注解配置的Filter,那麼會優先執行web.xml中配置的Filter