JavaWEB三大組件加載順序:listener -> filter -> servlet (當讀取web.xml文件的加載順序)
javax.servlet.Filter 是一個接口,過濾請求,實現請求的攔截或者放行,並且添加新的功能。
從上面的順序,知道 Filter 比 Servlet 先執行 ,那麼Filter 就可以攔截請求了,也就是說,所有請求進來,都先在他這裏走一遍,然後再到servlet的service中去
public class DemoFilter implements Filter {
protected final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.warn("DemoFilter狀態:[{}]", "過濾器初始化");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
logger.warn("DemoFilter狀態:[{}]", "執行過濾任務中");
// 放行,執行下一個過濾器
chain.doFilter(req, resp);
logger.warn("DemoFilter狀態:[{}]", "過濾執行完畢");
}
@Override
public void destroy() {
logger.warn("DemoFilter狀態:[{}]", "過濾器銷燬");
}
}
過濾器匹配URL規則:
精確匹配 —— 如/foo.htm,只會匹配foo.htm這個URL
路徑匹配 —— 如/foo/*,會匹配以foo爲前綴的URL
後綴匹配 —— 如*.htm,會匹配所有以.htm爲後綴的URL
其他寫法,如/foo/ ,/.htm ,/foo 都是不對的
在使用Filter的時候,光上面的 實現Filter是不夠的。必須在web.xml文件中配置Filter , 還可以自定義Filter的執行順序等。
下面我貼一段,SpringBoot使用Filter的代碼:、
配置Filter:
package com.toad.config.filter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import javax.servlet.Filter;
/**
* @author: wangqinmin
* @date: 2019/4/22 16:16
* @description: 仰天大笑出門去,我輩豈是蓬蒿人
*/
@Configuration
public class FilterConfig {
@Bean
public Filter demoFilter() {
return new DemoFilter();
}
@Bean
public Filter testFilter() {
return new TestFilter();
}
/**
* @return
*/
@Bean
@Order(value = 1) // 過濾器執行順序
public FilterRegistrationBean demoFilterBean() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(demoFilter());
// 設置過濾的url
registration.addUrlPatterns("/*");
return registration;
}
@Bean
@Order(2)
public FilterRegistrationBean testFilterBean() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(testFilter());
registration.addUrlPatterns(
"/index.html",
"/api/applications/views/*",
"/api/applications-details/views/details.html",
"/api/applications-logfile/views/logfile.html",
"/api/applications-metrics/views/metrics.html",
"/api/applications-environment/views/environment.html",
"/api/applications-logging/views/logging.html",
"/api/applications-jmx/views/jmx.html",
"/api/applications-threads/views/threads.html",
"/api/applications-auditevents/auditevents.html",
"/api/applications-trace/views/trace.html",
"/api/applications/*/logfile",
"/api/applications/*/env");
return registration;
}
}
自定義Filter (我這裏沒有做什麼過濾,都是直接放行了):
package com.toad.config.filter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.*;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author: wangqinmin
* @date: 2019/4/22 15:31
* @description: 仰天大笑出門去,我輩豈是蓬蒿人
*/
public class DemoFilter implements Filter {
protected final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.warn("DemoFilter狀態:[{}]", "過濾器初始化");
}
/**
* 暫時沒有做任何過濾
*
* @param request
* @param response
* @param chain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
logger.warn("DemoFilter狀態:[{}]", "執行過濾任務中");
// 放行,執行下一個過濾器
chain.doFilter(req, resp);
logger.warn("DemoFilter狀態:[{}]", "過濾執行完畢");
}
@Override
public void destroy() {
logger.warn("DemoFilter狀態:[{}]", "過濾器銷燬");
}
}
package com.toad.config.filter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.*;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author: wangqinmin
* @date: 2019/4/22 16:14
* @description: 仰天大笑出門去,我輩豈是蓬蒿人
*/
public class TestFilter implements Filter {
protected final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.warn("TestFilter狀態:[{}]", "過濾器初始化");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
logger.warn("TestFilter狀態:[{}]", "執行過濾任務中");
// 放行,執行下一個過濾器
chain.doFilter(req, resp);
logger.warn("TestFilter狀態:[{}]", "過濾執行完畢");
}
@Override
public void destroy() {
logger.warn("TestFilter狀態:[{}]", "過濾器銷燬");
}
}