JavaWeb——Filter
简介
Filter 也就是过滤器,我们在网络开发中往往需要对客户端发来的请求进行一定的预处理,并且对处理后的响应进行一些处理,此时就需要用到Filter。当服务器(TomCat)接收到客户端发来的请求后,先对符合过滤条件的请求拦截到Filter过滤器中,Filter对请求进行预处理后转发给下一个Filter(如果有的话),Filter处理完后放行请求去获取资源,最后返回的响应也要先经过一系列的Filter处理后再响应给客户端。
Filter生命周期
先来看看Filter接口:
public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {
}
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
default void destroy() {
}
}
可以看出Filter的生命周期分为三个阶段:
初始化
当服务器启动时,就会初始化Filter,调用 init() 方法。参数 FilterConfig 由服务器提前准备好。
FilterConfig 可以用于获取配置信息:
public interface FilterConfig {
String getFilterName();//获取Filter名称
ServletContext getServletContext();//获取ServletContext
String getInitParameter(String var1);//根据参数名获取参数值
Enumeration<String> getInitParameterNames();//获取所有参数名
}
过滤
可以通过 FilterChain.doFilter() 方法执行过滤,也就是结束本次过滤:
public interface FilterChain {
void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException;
}
销毁
当服务器运行结束后会调用 destroy() 方法销毁Filter
FilterChain过滤链
有时我们需要多个Filter,为了更好的控制Filter的执行顺序,我们可以通过@WebFIlter注解的priority属性来控制Filter执行顺序。
由于Filter会先处理客户端的请求Request,当请求获取完资源后还需要对返回的响应Response进行过滤处理。所以先处理Request的Filter,会靠后处理Response。可以看做一个先进后出的队列。
@WebFilter
@WebFilter 注解用于将一个类定义为过滤器(Filter),以便在Java Web应用程序中对请求进行处理。以下是@WebFilter注解中各个属性的用处:
-
urlPatterns:指定过滤器拦截的URL模式。可以是一个字符串数组,表示多个URL模式。例如,urlPatterns = {“/login”, “/logout”} 表示拦截"/login"和"/logout"这两个URL。
-
servletNames:指定过滤器拦截的Servlet名称。可以是一个字符串数组,表示多个Servlet名称。例如,servletNames = {“LoginServlet”, “LogoutServlet”} 表示拦截名为"LoginServlet"和"LogoutServlet"的两个Servlet。
-
initParams:用于设置过滤器的初始化参数。它是一个 @InitParam 注解的数组,每个 @InitParam 注解包含两个属性:name 和 value ,分别表示参数名和参数值。例如,initParams = { @InitParam(name = “param1”, value = “value1”), @InitParam(name = “param2”, value = “value2”) } 表示设置了两个初始化参数,分别为"param1"和"param2"。
-
dispatcherTypes:指定过滤器拦截的请求类型。它是一个 DispatcherType 枚举类型的数组。DispatcherType 有以下几个枚举值:
- REQUEST:拦截请求对象(HttpServletRequest)。
- FORWARD:拦截前向转发请求。
- INCLUDE:拦截包含请求。
- ERROR:拦截错误请求。
- ASYNC:拦截异步请求。
默认情况下,过滤器会拦截所有类型的请求。可以通过设置 dispatcherTypes 属性来限制过滤器拦截的请求类型。
-
asyncSupported:指定过滤器是否支持异步请求。如果设置为 true,则表示过滤器支持异步请求;如果设置为 false,则表示过滤器不支持异步请求。默认值为 true 。
-
priority:指定过滤器的优先级。数值越低,优先级越高。默认值为 0 。当有多个过滤器时,优先级高的过滤器会先执行。
-
name:指定过滤器的名称,用于标识Filter。这个属性是可选的,如果不设置,系统会自动为过滤器生成一个名称。
-
displayName:指定过滤器的显示名称,常用于美化控制台和日志的输出。这个属性也是可选的,如果不设置,系统会自动为过滤器生成一个显示名称。