Javaweb三大组件之Filter(过滤器)简单入门学习!

12 篇文章 0 订阅
6 篇文章 0 订阅

一、认识Filter

filter(过滤器),文字意思就是对事务进行过滤,在web服务中,使用过滤器就是对请求或进行拦截过滤,做出相应的处理。如请求字符编码、敏感词语和登录管理等等。在页面开发中,有好些许资源的访问都要用上同一部分的代码,为了避免繁琐,就可以用上过滤器,在这些页面中用于拦截。

二、Filter工作原理

我们使用过滤器,是请求和响应都会经过,即浏览器发起的请求和web资源返回的响应,过滤器每次执行都会执行一次doFilter()方法,用以交给下一个过滤器。工作原理如下:

image-20220730001013866

三、Filter使用测试

前期准备的导包什么的就不过多介绍了,就正常的servlet-api.jar包,学到这里了,估计都是懂得了。下面举一个解决乱码问题的过滤器示例:

步骤

  1. 实现Filter接口,Filter接口有很多,主要一定是要**jakarta.servlet.***包下的(tomcat9以下的就javax.servlet.*包)

    package com.yg.filter;
    
    import jakarta.servlet.*;
    
    import java.io.IOException;
    
    //过滤器解决乱码问题
    public class CharacterEncodingFilter implements Filter {
    
        
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
     
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        }
    
      
        public void destroy() {
        }
    }
    
  2. 实现接口就要重写它的的方法,有三个,对应着Filter的生命周期(和Servlet的十分相似)

    init() 初始化阶段:当服务器启动时,服务器(Tomcat)就会读取配置文件,创建Filter。
    doFilter() 拦截和过滤阶段:如果请求资源的路径符合我们的拦截路径,就会进入我们的过滤器,这个阶段在服务器运行过程中会一直循环。
    destroy() 销毁阶段:当服务器(Tomcat)关闭时,服务器创建的Filter也会随之销毁。

    //过滤器解决乱码问题
    public class CharacterEncodingFilter implements Filter {
    
        //初始化:web服务器启动时,就开始初始化了
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("Filter 初始化了!");
        }
    
        //处理部分:过滤功能实现代码块
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            servletRequest.setCharacterEncoding("utf-8");
            servletResponse.setCharacterEncoding("utf-8");
            servletResponse.setContentType("text/html;character=UTF-8");
    
            System.out.println("CharacterEncodingFilter执行前...");
            filterChain.doFilter(servletRequest,servletResponse);
            System.out.println("CharacterEncodingFilter执行后...");
        }
    
        //销毁:web服务器关闭的时候就销毁了
        public void destroy() {
            System.out.println("Filter 销毁了!");
        }
    }
    
  3. 使用filterChain参数调取doFilter()交给下一个过滤器使用

     /* Chain
        1.过滤中的所有代码,在过滤特定请求的时候都会执行
        2.要让过滤器继续执行,必须有下面这行代码,用于交给下一个过滤器
            filterChain.doFilter(servletRequest,servletResponse);
     */
      System.out.println("CharacterEncodingFilter执行前...");
      filterChain.doFilter(servletRequest,servletResponse);
      System.out.println("CharacterEncodingFilter执行后...");
    

    **补充:**之所以要使用filterChain.doFilter()方法是因为不一定只有一个过滤器,该方法用于将过滤后的内容传给下一个过滤器!过滤器执行循序符合web.xml中配置的先后顺序。此外, Tomcat在调用过滤器时,默认传入Request和Response两个参数封装了请求和响应,可以直接使用。但是其中的方法比较少,可以使用HttpServletRequest和HttpServletResponse进行强制转换,使用相应的方法。

  4. 在web.xml中注册filter

<!-- filter注册-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.yg.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/Show/*</url-pattern><!-- 指/Show以下的请求都会经过过滤器-->
</filter-mapping>

servlet测试代码如下:

package com.yg.servlet;

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

import java.io.IOException;

//CharacterEncodingFilter 测试代码
public class FilterDemo extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("过滤器,你好鸭!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

以上就是我的全部内容了,赶快打开编译器实操一下吧!掌握以上内容,基本就懂得使用Filter了,Filter的功能很多地方都可以用上,想要更深入的学习,就尝试一下登录管理权限的设置吧~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值