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详解 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 基于java文件上传-原始的Servlet方式

    下面是基于Java文件上传-原始的Servlet方式的完整攻略。 准备工作 在开始前,我们需要几个准备工作: 1.安装JDK并配置环境变量2.安装Tomcat并配置环境变量3.新建一个Java Web项目 编写HTML页面 在项目的WebContent目录下新建一个html文件,编写如下代码: <html> <body> <fo…

    Java 2023年6月15日
    00
  • Java多线程案例之阻塞队列详解

    Java多线程案例之阻塞队列详解 什么是阻塞队列? 阻塞队列(Blocking Queue)是一个支持在队列的两端进行插入与删除的队列。常用的阻塞队列有ArrayBlockingQueue、LinkedBlockingQueue等。阻塞队列在多线程的场景下常被使用,因为当队列为空或达到容量上限时,线程往往会被阻塞。在队列空的情况下,从队列中获取元素的操作将会…

    Java 2023年5月18日
    00
  • 详解Java中的延时队列 DelayQueue

    详解Java中的延时队列 DelayQueue 概述 DelayQueue是Java中的一个实现了Delayed的队列,它按照剩余时间从少到多的顺序对元素进行排序,每个元素都有一个过期时间,只有过期的元素才能被取出。 延时队列的实现 延时队列的实现需要实现Delayed接口,并重写getDelay()方法和compareTo()方法。 public inte…

    Java 2023年5月26日
    00
  • elastic-job源码(1)- job自动装配

    版本:3.1.0-SNAPSHOT git地址:https://github.com/apache/shardingsphere-elasticjob   Maven 坐标 <dependency> <groupId>org.apache.shardingsphere.elasticjob</groupId> <ar…

    Java 2023年4月27日
    00
  • Java 事务注解@Transactional回滚(try catch、嵌套)问题

    Java 事务注解@Transactional是用来标记一个方法需要被事务管理的,常用于对数据库进行操作时保证数据的一致性。在使用@Transactional标记方法时,我们可能会遇到回滚问题。 @Transactional的默认回滚行为 首先介绍一下@Transactional默认的回滚行为。如果一个被@Transactional标记的方法执行过程中抛出了…

    Java 2023年5月27日
    00
  • Java线程组与未处理异常实例分析

    Java线程组和未处理异常之间有一定的内在联系。在某些情况下,程序出现未处理异常之后可能会导致程序崩溃或者停止运行,这个时候我们需要通过Java线程组来捕获异常并进行处理。 什么是Java线程组 Java是一种多线程语言,线程是执行程序的基本单元。Java线程组是一组线程的集合,它可以将一组线程放在同一个组中,然后对这个组进行管理。Java线程组的主要作用是…

    Java 2023年5月27日
    00
  • java获取微信accessToken的方法

    Java获取微信accessToken的方法 微信accessToken是通过微信公众平台开发者中心生成的,用于公众号的基础服务。通过接口获取accessToken可以进行一些高级接口的操作。本文主要介绍在Java中如何获取微信accessToken。 1. 请求微信接口获取accessToken 1.1 请求地址 微信接口请求地址:https://api.…

    Java 2023年5月23日
    00
  • Java终止线程实例和stop()方法源码阅读

    Java中有多种方式可以终止线程,其中包括共享变量、使用interrupt()方法、使用stop()方法等,本文着重讲解stop()方法的使用和源码阅读。 1. stop()方法的使用 stop()方法是Thread类中提供的方法,可以立即终止线程的执行。但是,它并不推荐使用,因为它可能会导致线程未能完成它该做的任务,引发不确定的错误。 下面是stop()方…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部