WEB核心之过滤器(Filter)
程序员文章站
2022-05-23 08:36:05
...
文章目录
1 概念
在实际的项目开发中,我们对一些资源的访问需要设置一些限制,符合条件的允许访问,不符合条件的就不让访问资源。Java我们为提供了一个Filter接口,它是Servlet的三项规范之一,可以实现过滤效果。
2 简单的过滤器编写
过滤器的编写步骤一般可分为如下几个步骤:
- 编写一个Java类,实现Filter接口。
- 重写Filter接口的三个抽象方法。
- 使用注解或者web.xml配置文件来配置过滤器的拦截路径等内容。
//配置拦截范围等内容
@WebFilter("/*")
public class Demo01Filter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
System.out.println("filter running...");
//放行请求
chain.doFilter(req,resp);
}
@Override
public void destroy() {
}
}
3 过滤器的运行流程
- 客户端的请求先到Tomcat。
- Tomcat调用Filter1过滤器,Filter1再调用Filter过滤器。
- Filter过滤器执行到doFilter方法后,请求到达目标资源。
- 目标资源执行完后,Filter2执行chain.doFilter()后的代码。
- Filter1执行chain.doFilter()方法后的代码。
- Tomcat读取response缓冲区,给客户端响应。
4 过滤器相关的API
4.1 Filter的生命周期
- 何时创建:在服务器启动的时候由Tomcat创建,执行且执行一次init方法。
- 何时销毁:在服务器关闭的时候由Tomcat销毁,执行且执行一次destroy方法。
- 每次拦截请求必定执行doFilter方法。
4.2 init()方法
init(FilterConfig config)
:初始化方法,当服务器启动的时候,执行且仅执行一次该方法。
init方法的参数FilterConfig对象的方法:
方法 | 功能描述 |
---|---|
ServletContext getServletContext() | 获得ServletContext对象 |
String getFilterName() | 获取过滤器的名称 |
String getInitParameter(String paraName) | 获得指定名称的初始化参数值 |
4.3 doFilter()方法
doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
:每次拦截到请求的时候,都会执行该方法。
-
ServletRequest req
:代表HTTP请求的request对象,通常强转成HttpServletRequest。 -
servletResponse resp
:代表HTTP响应的response对象,通常强转成HttpServletResponse。 -
FilterChain chain
:过滤器链对象,里面是可以拦截此次请求的所有过滤器对象组成的对象。我们可以调用它的放行方法chain.doFilter(request, response)
,将请求方法放行到下一个过滤器或者目标资源。
5 配置过滤器
5.1 注解配置
@WebFilter(urlPatterns = "/*",
dispatcherTypes = DispatcherType.REQUEST,
filterName = "Demo01Filter",
initParams = {
@WebInitParam(name="aa",value="AA"),
@WebInitParam(name="bb",value="BB"),
}
)
-
urlPatterns
:请求的拦截路径。- 拦截完全匹配的请求:例如:
/demo01
。 - 拦截目录匹配的请求:要求以
/
开头,以*
结尾。例如/*
和/demo/*
。 - 拦截后缀名匹配的请求:要求以
*
开头,后缀名结尾。例如*.jsp
。
- 拦截完全匹配的请求:例如:
-
dispatcherTypes
:表示的是拦截方式。常用的有以下两种-
DispatcherType.REQUEST
:只会拦截来自客户端的请求,请求转发的请求不会拦截。 -
DispatcherType.FORWARD
:拦截请求转发的请求。
-
-
filterName
:过滤器的名称。 -
initParams
:过滤器的初始化参数。
注意:
urlPatterns
可以多种匹配方式结合使用,因为它的属性是一个数组,String[] urlPatterns() default {};
所以我们可以这样写:
@WebFilter(urlPatterns = {"/*.jsp","/demo/*"})
同理拦截方式dispatcherTypes
也可以多种拦截方式配合使用。DispatcherType[] dispatcherTypes() default {DispatcherType.REQUEST};
,需要注意的是,此属性的默认属性是DispatcherType.REQUEST
。
5.2 web.xml配置
<filter>
<filter-name>demo01</filter-name>
<filter-class>com.itheima.filter.Demo01Filter</filter-class>
<init-param>
<param-name>aa</param-name>
<param-value>AA</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>demo01</filter-name>
<!--设置拦截路径-->
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
5.3 过滤器的执行顺序
- 注解方式配置:由过滤器的名称决定,谁排在前面就先执行。
-
web.xml配置:由
filter-mapping
的顺序决定,在前面的先执行。
下一篇: 10。过滤器