Filter(过滤器)

文章目录

过滤器------Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener。

它是在2000年发布的Servlet2.3规范中加入的一个接口。是Servlet规范中非常实用的技术。

它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作。

常见应用场景:URL级别的权限控制;过滤敏感词汇;中文乱码问题等等。

过滤器的编写:

java 复制代码
@WebFilter(filterName = "FilterDemo2",urlPatterns = "/*")
public class FilterDemo1 implements Filter {
    /**
     * 过滤器的核心方法
     * @param request
     * @param response
     * @param chain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
    throws IOException, ServletException {
        /**
         * 如果不写此段代码,控制台会输出两次:FilterDemo1拦截到了请求。
         */
        HttpServletRequest req = (HttpServletRequest) request;
        String requestURI = req.getRequestURI();
        if (requestURI.contains("favicon.ico")) {
            return;
        }
        System.out.println("FilterDemo1拦截到了请求");
    }
}

过滤器 API

Filter

返回类型 方法 简介

void init(FilterConfig conf) 用于执行过滤器的初始化工作,web容器会在web项目启动时自动调用该方法。

void doFilter(ServletRequest request,SerlvetResponse response,FilterChain chain) 当请求和响应被过滤器拦截后,都会交给doFilter来处理:其中两个参数分别是被拦截request和response对象,可以使用chain的doFliter方法来放行。

void destroy() 用于释放关闭Filter对象打开的资源,在web项目关闭时,由web容器自动调用该方法。


FilterConfig

FilterChain

生命周期

出生 当应用加载的时候执行实例化和初始化方法。

活着 只要应用一直提供服务,对象就一直存在。

死亡 当应用卸载时,或者服务器宕机时,对象消亡。

Filter的实例对象在内存中也只有一份。所以也是单例的。

过滤器核心方法的细节

java 复制代码
/**
 * 过滤器的核心方法
 */
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    /**
     * 如果不写此段代码,控制台会输出两次:FilterDemo1拦截到了请求。
    HttpServletRequest req = (HttpServletRequest) request;
    String requestURI = req.getRequestURI();
    if (requestURI.contains("favicon.ico")) {
        return;
    }*/
    System.out.println("FilterDemo1拦截到了请求");
    //过滤器放行
    chain.doFilter(request, response);
    System.out.println("FilterDemo1放行之后,又回到了doFilter方法");
}

测试运行结果,我们发现过滤器放行之后执行完目标资源,仍会回到过滤器中:

多个过滤器执行顺序

运行结果

相关推荐
程序员-周李斌12 分钟前
Java NIO [非阻塞 + 多路复用解]
java·开发语言·开源软件·nio
程序猿小蒜14 分钟前
基于Spring Boot的宠物领养系统的设计与实现
java·前端·spring boot·后端·spring·宠物
合作小小程序员小小店15 分钟前
web网页开发,在线%食堂管理%系统,基于Idea,html,css,jQuery,java,ssm,mysql。
java·前端·mysql·html·intellij-idea·jquery
奋斗的小高27 分钟前
Docker 安装与使用
java
毕设源码-钟学长38 分钟前
【开题答辩全过程】以 浮生馆汉服租赁管理系统为例,包含答辩的问题和答案
android·java·tomcat
90后小陈老师38 分钟前
用户管理系统 07 项目前端初始化 | 新手实战 | 期末实训 | Java+SpringBoot+Vue
java·前端·spring boot
Coder-coco1 小时前
点餐|智能点餐系统|基于java+ Springboot的动端的点餐系统小程序(源码+数据库+文档)
java·vue.js·spring boot·小程序·论文·毕设·电子点餐系统
Halo_tjn1 小时前
Set集合专项实验
java·开发语言·前端·python
嘟嘟w1 小时前
Spring 核心注解深度分析
java·后端·spring
9***Y482 小时前
Java开发工具IntelliJ IDEA技巧
java·开发语言·intellij-idea