关于过滤器Filter的介绍和使用详解
作者:透明果冻
这篇文章主要介绍了关于过滤器Filter的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
1.简介
在 Java Web 开发中,Filter
是一个非常重要的组件,用于在请求到达 Servlet 之前或响应返回客户端之前对请求和响应进行预处理或后处理。
Filter
可以用来实现多种功能,如日志记录、权限检查、编码转换、请求头修改等。就好比机场的层层安检,对前来的乘客进行检查过滤,携带违规物品,未买机票等不满足机场要求的就会被阻止进入。
2.Filter 的工作原理
配置:在 web.xml
文件中或使用注解来配置 Filter
。
- 在
web.xml
中配置
<filter> <!--设置filter的别名--> <filter-name>LoggingFilter</filter-name> <!--filter的字节码路径--> <filter-class>com.example.LoggingFilter</filter-class> </filter> <filter-mapping> <!--使用filter别名所对应的过滤路径,可以有多个--> <filter-name>LoggingFilter</filter-name> <!--/*表示对所有路径进行过滤--> <url-pattern>/*</url-pattern> <!--所要过滤的servlet的别名--> <servlet-name>servlet1</servlet-name> </filter-mapping>
使用注解@WebFilter
,它有如下几个常用的值:
filterName
: filter的别名相当于标签urlPatterns
:所要过滤的资源url,相当于标签ServletNames
:所要过滤的servlet别名,相当于 servletNames
@WebFilter( filterName = "loggingFilter", urlPatterns = {"/servlet1","*.html"}, servletNames = {"servlet1","Servlet2"} )
拦截:
- 当请求到达时,
Filter
会拦截请求,并执行预处理逻辑。 - 在请求到达目标资源前所执行的一些操作,如检查用户是否有权限访问记录、请求和响应的信息
放行:
Filter
可以选择是否放行请求到目标资源(如 Servlet)。此时会执行FilterChain
的doFilter
方法代表放行。FilterChain
表示Filter
链,若对于该资源,后续还有其他Filter
要进行过滤,此时的doFilter
方法就会转而执行其他的Filter
;若此时没有Filter
要进行过滤,那么便会放行,进行目标资源的处理(如,servlet)
后处理:
- 在目标资源(如 Servlet)处理完请求后
Filter
可以对响应进行后处理
3.Filter的生命周期
包括初创建、始化、过滤和销毁四个阶段。
阶段 | 对应方法 | 执行时机 | 执行次数 |
---|---|---|---|
创建对象 | 构造器 | web应用启动时 | 1次 |
初始化方法 | void init(FilterConfig filterConfig) | 构造完毕 | 1次 |
过滤请求 | void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) | 每次请求 | 多次 |
销毁 | default void destroy() | web应用关闭时 | 1次 |
特别注意的的时Filter
在web应用启动时就创建了,并且进行初始化,这个过程只会出现一次。
4.Filter的执行顺序
一个web项目中,可以同时定义多个过滤器,当多个过滤器对同一个资源进行过滤时,工作位置有先后,整体形成一个工作链,称之为过滤器链(FilterChain)
- 当使用配置文件进行配置时
- 过滤器链中的过滤器的顺序由<filter-mapping>标签的定义顺序决定
- 当使用注解的方式进行配置时
- 通常会把全部的过滤器放在一个包下,此时,执行顺序为类名的字典排序由小到大依次执行
5.一个简单的Filter的示例
案例要求:
当用户访问资源时,检查其是否进行登陆,若未登录则跳转到登录页, 若以登录则放行
@WebFilter("/*") public class CheckLoginFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //向下转型,实现重定向,获得session等功能 HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // 检查用户是否已登录 String user = (String) httpRequest.getSession().getAttribute("username"); if (user == null) { // 用户未登录,重定向到登录页面 httpResponse.sendRedirect(httpRequest.getContextPath() + "/login"); } else { // 用户已登录,放行请求,注意是调用的FilterChain中的doFilter方法!! chain.doFilter(request, response); } } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。