JavaWeb 22 过滤器 Filter

7.2 过滤器 Filter


Filter:过滤网站数据的 过滤器。

  • 比如处理中文乱码
  • 登录验证
    在这里插入图片描述

这个过滤器 在后台也是个程序,只不过是要 去实现 过滤器接口。

首先我们要知道的是,这个 接口 我们一定不要 导入 错了。在这里插入图片描述
Tomcat 10 支持的 Filter 接口是 jakarta 下面的。

然后我们 会发现 要重写 三个 方法,初始化 过滤 销毁

  • 初始化 一般 都是在 真正 执行 servlet 程序之前 需要做关于数据的相关什么。

  • 过滤 一般是在 servlet 程序执行之前 做什么 过滤的处理,比如说 登录的验证、编码的转化、这些 。。

  • 销毁 就是在销毁的时候 要做什么 事情!

那么我们 可以 做一个 示范,比如说以前我们 处理中文乱码问题,都是写在 每个 servlet 程序里面的,这次我们直接 写在 Filter 程序里。

package com.muquanyu.filter;

import jakarta.servlet.*;

import java.io.IOException;

public class CharacterEncodingFilter implements Filter {

    //初始化
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterEncodingFilter 已被初始化!");
        //Filter.super.init(filterConfig);
    }

    //过滤器要做的事
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html");
        servletResponse.setCharacterEncoding("utf-8");

        System.out.println("CharacterEncodingFilter 执行前......");

        //Chain 链
        //让我们的请求 继续走,如果不写程序到这里就被拦截终止了。
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("CharacterEncodingFilter 执行后......");
    }

    //销毁:web服务器关闭后,过滤器才会被销毁!
    @Override
    public void destroy() {
        System.out.println("CharacterEncodingFilter 已销毁!");
        //Filter.super.destroy();
    }
}

filterChain.doFilter(servletRequest,servletResponse);

这条代码 是干什么的呢。它 意指 链起来,就是说 当我们 过滤完一个之后,如果你还想 继续过滤,那么就必须 调用这条代码。因为我们知道每个请求都是不一样的。我们肯定要有一个方法来接收每次都不一样的请求和响应!!

这样才能再次进行请求和响应的过滤!所以这条代码是必须要写的!如果不写,程序就执行到这里 终止了。。。这算是一个 使用规则。

那么 我们 过滤器代码写完了,难道 直接就可以用吗?

我们是不是 要声明一下 该过滤器 应用于 哪些 请求地址呀?只有做了 这个声明,我们的过滤器 才知道用到哪里。要不然不就白写了吗。

所以过滤器 在 web.xml 里面 也要写一下 它自己的配置。

<filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.muquanyu.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>

意思就是说 该过滤器,应用于 /servlet/ 下面的 所有请求地址,只要是 关于 这个 地址的,我们 就必须要 先经过 过滤器 对 请求和 响应 甚至是 一些 数据 做 提前的处理。然后才能 去执行 Servlet 程序。

  • Servlet 中文乱码程序
package com.muquanyu.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class ShowServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("我是中文!");
        //super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doPost(req, resp);
    }
}
  • 为了作为过滤器是否有作用 的区分,我们把这个 servlet 程序设定两种 url 请求。
<servlet>
        <servlet-name>ShowServlet</servlet-name>
        <servlet-class>com.muquanyu.servlet.ShowServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>ShowServlet</servlet-name>
        <url-pattern>/servlet/show</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>ShowServlet</servlet-name>
        <url-pattern>/show</url-pattern>
    </servlet-mapping>

一个是 /show , 一个是 /servlet/show

我们知道 我们写的过滤器 只对 servlet/show 会进行 响应的 过滤处理,而不会 对 show 进行 过滤处理,所以 访问 show 的时候 显示的应该是 中文乱码,而 经过 过滤器 处理的 servlet/show 则是 正常的中文 显示给我们!!!

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
当服务器被关掉后,自动会执行 销毁的 那个 方法。
在这里插入图片描述

如此看来,Filter 过滤器 也不过如此。它 好像类似于 一个 公共的 预处理 程序,为我们 提前处理 各种问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值