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状态:[{}]", "过滤器销毁");
}
}