java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > 过滤器Filter的介绍和使用

关于过滤器Filter的介绍和使用详解

作者:透明果冻

这篇文章主要介绍了关于过滤器Filter的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.简介

在 Java Web 开发中,Filter 是一个非常重要的组件,用于在请求到达 Servlet 之前或响应返回客户端之前对请求和响应进行预处理或后处理。

Filter 可以用来实现多种功能,如日志记录、权限检查、编码转换、请求头修改等。就好比机场的层层安检,对前来的乘客进行检查过滤,携带违规物品,未买机票等不满足机场要求的就会被阻止进入。

2.Filter 的工作原理

配置:在 web.xml 文件中或使用注解来配置 Filter

<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,它有如下几个常用的值:

  1. filterName: filter的别名相当于标签
  2. urlPatterns:所要过滤的资源url,相当于标签
  3. ServletNames:所要过滤的servlet别名,相当于 servletNames
@WebFilter(
        filterName = "loggingFilter",
        urlPatterns = {"/servlet1","*.html"},
        servletNames = {"servlet1","Servlet2"}
)

拦截

放行

后处理

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

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);
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文