文章目录
前言
提示:这里可以添加本文要记录的大概内容:
一、过滤器
1.1 什么是过滤器
- 过滤器是Servlet2.3规范中定义的一种小型的、可插入的Web组件。用来拦截Servlet容器的请求和响应过程,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。
- 过滤器通常是封装了一些功能的Web组件,这些功能很重要,但对于处理客户端请求或发送响应来说不是决定性的。
- 典型的应用包括记录请求和响应的数据、管理会话属性等
1.2 如何编写过滤器
1.2.1 过滤器的快速入门
-
生活中的过滤器:比喻成土匪。
-
编写一个Java类,实现Filter接口。
-
在doFilter方法中实现拦截处理逻辑。
-
将过滤器添加到Web程序中。
-
把过滤器和Web应用一起打包部署。
1.2.2 通过注解实现过滤器
@WebFilter("/*")//拦截所有请求
public class OneFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
//放行
filterChain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
1.2.3 通过配置web.xml文件实现过滤器
1.2.3.1 过滤器细节:
- web.xml配置.
- 过滤器执行流程.
- 过滤器生命周期方法.
- 过滤器配置详解.
- 过滤器链(配置多个过滤器)
1.2.3.1.1 xml配置
web.xml配置文件:
<filter>
<display-name>SecondFilter</display-name>
<filter-name>SecondFilter</filter-name>
<filter-class>com.qst.filter.SecondFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SecondFilter</filter-name>
<url-pattern>/*</url-pattern>
<!--拦截路径 -->
</filter-mapping>
public class OneFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
//放行
filterChain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
1.2.3.1.2 过滤器执行流程:
1.执行过滤器。
2.执行放行后的资源。
3.回来执行过滤器放行代码下边的代码。
1.2.3.1.3 过滤器生命周期方法
- init:在服务器后动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源。
- doFilter:每一次请求被拦截资源时,会执行。执行多次。
- destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源。
1.2.3.1.4 过滤器配置详解
-
拦截路径配置:
- 具体资源路径:/index.jsp只有访问index.jsp资源时,过滤器才会被执行。
- 拦截目录:/user/* 访问/user下的所有资源时,过滤器都会被执行。
- 后缀名拦截:*.jsp访问所有后缀名为jsp资源时,过滤器都会被执行。
- 拦截所有资源∶/*访问所有资源时,过滤器都会被执行。
-
拦截方式配置:
资源被访问的方式-
注解配置:设置dispatcherTypes属性
- REQUEST:默认值。浏览器直接请求资源。
- FORWARD:转发访问资源。
- INCLUDE:包含访问资源。
- ERROR:错误跳转资源。
- ASYNC:异步访问资源。
-
web.xml配置
设置< dispatcher > < /dispatcher>标签即可。
-
1.2.3.1.5 过滤器链(多个过滤器)
- 执行顺序∶如果有两个过滤器:过滤器1和过滤器2
1.过滤器1
2.过滤器2
3.资源执行
4.过滤器2
5.过滤器1
过滤器先后顺序问题:
1、注解配置∶按照类名的字符串比较规则比较,值小的先执行。
如:AFilter和BFilter,AFilter就先执行了。
2、 web.xml配置: < filter-mapping> 谁定义在上边,谁先执行。