Java过滤器Filter详解

关于“Java过滤器Filter详解”的攻略,我将从以下几个方面进行详细讲解:

关于“Java过滤器Filter详解”的攻略,我将从以下几个方面进行详细讲解:

  1. 概念与简介
  2. 过滤器的工作原理
  3. 过滤器的生命周期
  4. 过滤器的配置
  5. 过滤器的示例说明

1. 概念与简介

Filter(过滤器)是 Java Web 中的一个组件,它可以截取客户端发送的请求和服务器接收到的响应,对其进行修改或者添置一些参数,并将其传送给下一个过滤器或目标资源(如 Servlet、JSP)。

过滤器可以用于处理编码解码、权限控制、日志记录、事务管理、性能监控等功能,在 Web 开发中是比较常用的组件。

2. 过滤器的工作原理

过滤器继承了javax.servlet.Filter接口,这个接口定义了三个方法:

  • init:初始化过滤器
  • doFilter:拦截、处理请求以及响应
  • destroy:销毁过滤器

当 Web 容器接收到客户端发送的请求后,会先通过对应的过滤器,如果有多个过滤器,按照顺序依次执行,最后再到达 Web 资源(Servlet、JSP 等)。

当 Web 资源产生响应后,也会先经过对应的过滤器,在按照倒序依次执行,最后再返回给客户端。

3. 过滤器的生命周期

  1. Web 容器在加载我们的 Web 应用程序(war)时,会根据配置文件中规定的Filter,对配置的 Filter 类进行加载,并调用其 init 方法
  2. 当有请求发送来时,通过 doFilter 方法执行过滤操作
  3. Web 容器在卸载 Web 应用程序(war)时,会调用 destroy 方法,销毁所有的 Filter 对象

4. 过滤器的配置

Web.xml 中定义的如下节点:

<filter>
  <filter-name>Filter名称</filter-name>
  <filter-class>Filter全类名</filter-class>
  <init-param>
    <param-name>初始化参数名称</param-name>
    <param-value>初始化参数值</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>Filter名称</filter-name>
  <url-pattern>匹配的URL</url-pattern>
</filter-mapping>

5. 过滤器的示例说明

现在我们来看一个简单的过滤器示例,假设我们需要在用户访问网站时,对其进行权限验证,只有用户登录且权限符合时,才能访问。

public class AuthFilter implements Filter{
    private FilterConfig cfg;

    @Override
    public void init(FilterConfig cfg) throws ServletException {
        this.cfg = cfg;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse res = (HttpServletResponse)response;

        HttpSession session = req.getSession(false);
        if(session == null || session.getAttribute("user") == null){
            res.sendRedirect("/login");
            return;
        }

        String url = req.getRequestURI().substring(req.getContextPath().length());
        if(url.startsWith("/admin") && !session.getAttribute("admin").equals(true)){
            res.sendRedirect("/unauthorized");
            return;
        }

        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        this.cfg = null;
    }
}

在这个过滤器中,我们定义了一个 AuthFilter 类,并实现了 Filter 接口的三个方法,其中 doFilter 是最重要的方法。

在 doFilter 方法中,我们首先获取 HttpServletRequest 和 HttpServletResponse 对象,然后根据 HttpServletRequest 获取 HttpSession 对象。接下来,判断用户是否登录,如果没有登录,就重定向到登录页面;如果已经登录,再判断其是否有权限访问该页面,如果没有权限,就重定向到未授权页面;最后,调用 filterChain 的 doFilter 方法,将请求和响应传递给下一个过滤器或者目标 Servlet。

接下来,我们再来一个示例,我们需要在所有请求的头部(Header)中,添加一个固定的 Token 用于验证请求的合法性。根据前面的介绍,我们知道过滤器可以在请求被响应之前截获,并对请求进行修改。因此,这个任务可以很轻松地通过添加一个过滤器来实现。

public class AuthTokenFilter implements Filter{
    private FilterConfig cfg;
    private String token = "MY_AUTH_WIDGET_TOKEN_";

    @Override
    public void init(FilterConfig cfg) throws ServletException {
        this.cfg = cfg;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse res = (HttpServletResponse)response;

        res.setHeader("auth-token", token + System.currentTimeMillis());
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        this.cfg = null;
    }
}

在这个过滤器中,我们首先获取 HttpServletRequest 和 HttpServletResponse 对象,并在 Response 的 Header 中添加一个 auth-token,值为一个固定的字符串加上当前的时间戳。最后,调用 filterChain 的 doFilter 方法,将请求和响应传递给下一个过滤器或者目标 Servlet。

本文标题为:Java过滤器Filter详解

基础教程推荐