原文鏈接:java過濾器(Filter – 編程屋
目錄
1 過濾器簡介
2 Filter詳細(xì)介紹
3 Filter的用法
3.1 用法1
?3.2 用法2
1 過濾器簡介
filter也稱之為過濾器,它是javaWeb三大組件之一(Servlet程序、Listener監(jiān)聽器、Filter過濾器)
作用:既可以對請求進(jìn)行攔截,也可以對響應(yīng)進(jìn)行處理。
常見場景:權(quán)限檢查,日記操作、攔截請求、過濾操作、對請求字符設(shè)置編碼。
2 Filter詳細(xì)介紹
要想介紹filter,就必須介紹Filter中的三個方法。
/**
* web應(yīng)用啟動時,web服務(wù)器將創(chuàng)建Filter的實例對象,并調(diào)用init方法,讀取web.xml的配置,完成對象的初始化功能,
* 從而為后續(xù)的用戶請求做好攔截的準(zhǔn)備工作(filter對象只會創(chuàng)建一次,init方法也只會執(zhí)行一次,開發(fā)人員通過init的參數(shù),
* 可或得代表當(dāng)前filter配置信息的FilterConfig對象)
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 這個方法完成實際的過濾操作,當(dāng)客戶請求訪問與過濾器相關(guān)聯(lián)的URL的時候,Servlet過濾器將先執(zhí)行doFilter方法,F(xiàn)ilterChain參數(shù)用于訪問后續(xù)過濾器
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
/**
* filter創(chuàng)建后會保存在內(nèi)存中,當(dāng)web應(yīng)用移除或者服務(wù)器停止時才銷毀,該方法在Filter的生命周期中僅執(zhí)行一次,在這個方法中,可以釋放過濾器使用的資源
*/
@Override
public void destroy() {
}
3 Filter的用法
3.1 用法1
1)自定義一個過濾器實現(xiàn)Filter接口、配置@WebFilter注解,配置攔截路徑(也可通過web.xml配置)
@WebFilter(urlPatterns = "/*")
public class MyFilterOne implements Filter {
/**
* web應(yīng)用啟動時,web服務(wù)器將創(chuàng)建Filter的實例對象,并調(diào)用init方法,讀取web.xml的配置,完成對象的初始化功能,
* 從而為后續(xù)的用戶請求做好攔截的準(zhǔn)備工作(filter對象只會創(chuàng)建一次,init方法也只會執(zhí)行一次,開發(fā)人員通過init的參數(shù),
* 可或得代表當(dāng)前filter配置信息的FilterConfig對象)
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 這個方法完成實際的過濾操作,當(dāng)客戶請求訪問與過濾器相關(guān)聯(lián)的URL的時候,Servlet過濾器將先執(zhí)行doFilter方法,F(xiàn)ilterChain參數(shù)用于訪問后續(xù)過濾器
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("我是過濾器,我進(jìn)來了");
}
/**
* filter創(chuàng)建后會保存在內(nèi)存中,當(dāng)web應(yīng)用移除或者服務(wù)器停止時才銷毀,該方法在Filter的生命周期中僅執(zhí)行一次,在這個方法中,可以釋放過濾器使用的資源
*/
@Override
public void destroy() {
}
}
2)在啟動類上加上@ServletComponentScan注解
@SpringBootApplication
@ServletComponentScan
public class SpringbootInterceptorApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootInterceptorApplication.class, args);
}
}
3)controller:
@RestController
public class LoginController {
@GetMapping("/test/filter")
public String testFilter(){
return "該請求被攔截了,但是在過濾器中已經(jīng)放行了";
}
}
直接瀏覽器訪問:
?控制臺輸出:發(fā)現(xiàn)該請求已經(jīng)被過濾去攔截
?3.2 用法2
1)自定義一個過濾器實現(xiàn)Filter接口、配置攔截路徑(也可通過web.xml配置)
public class MyFilterOne implements Filter {
/**
* web應(yīng)用啟動時,web服務(wù)器將創(chuàng)建Filter的實例對象,并調(diào)用init方法,讀取web.xml的配置,完成對象的初始化功能,
* 從而為后續(xù)的用戶請求做好攔截的準(zhǔn)備工作(filter對象只會創(chuàng)建一次,init方法也只會執(zhí)行一次,開發(fā)人員通過init的參數(shù),
* 可或得代表當(dāng)前filter配置信息的FilterConfig對象)
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 這個方法完成實際的過濾操作,當(dāng)客戶請求訪問與過濾器相關(guān)聯(lián)的URL的時候,Servlet過濾器將先執(zhí)行doFilter方法,F(xiàn)ilterChain參數(shù)用于訪問后續(xù)過濾器
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("我是過濾器,我進(jìn)來了");
filterChain.doFilter(servletRequest, servletResponse);
}
/**
* filter創(chuàng)建后會保存在內(nèi)存中,當(dāng)web應(yīng)用移除或者服務(wù)器停止時才銷毀,該方法在Filter的生命周期中僅執(zhí)行一次,在這個方法中,可以釋放過濾器使用的資源
*/
@Override
public void destroy() {
}
}
2)在啟動類上注冊
@SpringBootApplication
public class SpringbootInterceptorApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootInterceptorApplication.class, args);
}
/**
* 注冊Filter
*/
@Bean
public FilterRegistrationBean getFilterRegistrationBean(){
FilterRegistrationBean bean = new FilterRegistrationBean(new MyFilterOne());
//bean.addUrlPatterns(new String[]{"*.do","*.jsp"});
bean.addUrlPatterns("/*");
return bean;
}
}
測試結(jié)果與3.1相同。
總結(jié):
要想調(diào)用配置一個過濾器:
1)啟動類上增加注解@ServletComponentScan
2)新建一個類使其實現(xiàn)Filter接口,并實現(xiàn)里面的三個方法
3)在新建類上加上@WebFilter()注解,配置需要攔截的規(guī)則
4)在doFilter方法中控制filterChain.doFilter(servletRequest, servletResponse)調(diào)用
同樣,如果前后端交互有遇到跨域問題的,也可以通過Filter解決(親測有效),如:文章來源:http://www.zghlxwxcb.cn/news/detail-828257.html
以上只是部分內(nèi)容,為了維護(hù)方便,本文已遷移到新地址:java過濾器(Filter – 編程屋文章來源地址http://www.zghlxwxcb.cn/news/detail-828257.html
到了這里,關(guān)于java過濾器(Filter)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!