一、過濾器的概述
1.1過濾器的概念及作用
概念
過濾器是一個能夠攔截客戶端與服務端請求和響應的web組件(Servlet、Filter、Listener)。
2.畫圖分析
攔截請求:在請求到達客戶端要訪問的web資源前攔截請求。
攔截響應:在響應到達客戶端之前攔截響應 。
為什么要使用過濾器
在實際項目中,我們對訪問某些資源的請求需要進條件的篩選、過濾。當這個請求滿足特定情況,才能讓這個請求訪問目標資源,如果不滿足條件,就不讓訪問目標資源。比如,我們在論壇上發帖,網絡網網需要對所發的內容進行過濾,如果有不適合的 字眼,就需要對其特殊處理。這就是通過過濾來完成。
二、過濾的應用場景
1.過濾論壇中的非法字符
2.登錄權限檢查
3.統一處理項目的中文亂碼(請求和響應的中文亂碼)
三、過濾開發入門
需求:編寫一個Filter,攔截瀏覽器發給HelloServlet的請求
步驟:
1.用Filter接口的doFilter方法進行請求和響應的攔截。
2.開發步驟:
【實現Filter接口】
第一步:編寫一個普通的java類HelloFilter,實現Filter接口,重寫doFilter方法;
第二步:在doFilter方法中打印"請求被攔截了......";
【配置Filter】
第一步:在web.xml文件中配置Filter的類路徑:
<filter>
<filter-name>HelloFilter</filter-name>
<filter-class>com.heima.filter.HelloFilter</filter-class>
</filter>
第二步:配置HelloFilter攔截的Servlet的映射路徑:
<filter-mapping>
<filter-name>HelloFilter</filter-name>
<url-pattern>/helloServlet</url-pattern>
</filter-mapping>
3.編寫HelloServlet,配置映射路徑為/helloServlet
4.啟動tomcat,訪問HelloServlet。
實現:
package com.mazai.filter;
import javax.servlet.*;
import java.io.IOException;
/**
* @author buguniao
* @version v1.0
* @date 2018/12/16 23:38
* @description TODO
**/
public class HelloFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("請求被攔截了..............");
}
@Override
public void destroy() {
}
}
第二步:
1.配置Filter
第一步:在web.xml文件中配置Filter的類路徑:
<filter>
<filter-name>HelloFilter</filter-name>
<filter-class>com.heima.filter.HelloFilter</filter-class>
</filter>
第二步:配置HelloFilter攔截的Servlet的映射路徑:
<filter-mapping>
<filter-name>HelloFilter</filter-name>
<url-pattern>/helloServlet</url-pattern>
</filter-mapping>
2.編寫HelloServlet,配置映射路徑/helloServlet
package com.mazai.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;
/**
* @author buguniao
* @version v1.0
* @date 2018/12/16 23:54
* @description TODO
**/
@WebServlet("/helloServlet")
public class HelloServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HelloServlet接收請求......");
}
}
3、啟動tomcat,訪問HelloServlet,通過測試,發現請求被攔截了,並沒有到達HelloServlet。如果需要放行,則需要在Filter中編寫以下代碼 :
四、Filter的注解開發
Servlet3.0版本的Filter提供了注解開發,注解能夠取代對Filter的配置,使得Filter的開發更高效;配置Filter使用的注解是:@WebFilter(urlPatterns = "/demo") 。
1、Filter的注解開發步驟
第一步:創建一個普通的java類實現Filter接口,重寫抽象方法;
第二步:在這個類上面使用@WebFilter注解進行映射路徑的配置,如:@WebFilter(urlPatterns = "/demo");
第三步:重寫doFilter方法,進行具體的業務邏輯處理;
【注解開發示例】AnnDemo1Filter.java
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(urlPatterns = "/demo")
public class AnnDemo1Filter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}
2、使用IDEA的Filter注解模板
IDEA開發工具提供了Filter注解模板幫助我們簡化Filter的注解開發,具體做法如下:
第一步:配置Filter注解模板
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebFilter(urlPatterns = "/")
public class ${Class_Name} implements javax.servlet.Filter {
public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException {
}
public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, java.io.IOException {
chain.doFilter(req, resp);
}
public void destroy() {
}
}
第二步:使用模板創建Filter;
在任意包下面,鼠標右鍵new--->Filter
3、注解開發注意事項
當有多個Filter都對同一個請求路徑進行攔截的時候,xml配置和注解中Filter執行順序不一樣!!!
xml配置方式的Filter,執行順序按照在web.xml中配置的順序,從上到下執行;
注解開發的Filter,執行的順序是按照實現類的字母表順序依次執行!