过滤器Filter

8 篇文章 0 订阅
4 篇文章 0 订阅
本文介绍了JavaWeb中的过滤器Filter,主要用于拦截请求和响应,处理数据流。讲解了Filter的配置、生命周期方法以及实际开发中的应用,如解决中文乱码、屏蔽敏感词和控制资源访问权限。
摘要由CSDN通过智能技术生成

过滤器Filter

功能:1、用来拦截传入的请求和传出的相应。2、修改或以某种方式处理正在客户端和服务端之间交换的数据流。

使用:过滤器其实和Servlet一样,都是JavaWeb提供的一组接口,开发者只需要自定义一个实现类实现该接口即可。不过他和Servlet的实现却有一些区别:

  • Java8新特性中,新增了对于接口中抽象方法的默认属性设定。也就是在其接口的抽象方法前加上了default关键字。加上了该关键字后的接口抽象方法可以在实现的时候不必重写。这点和我们以前所了解的接口特性是不同的。
  • Servlet中,所有接口的抽象方法都需要被重写,所以衍生出了GenericServlet和HttpServlet,而Filter中的生命周期方法则在前加上了default关键字,因此不需要去进行重写。

在这里插入图片描述

在这里插入图片描述

Filter的一系列配置

在xml中配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">


    <filter>
        <filter-name>character</filter-name>
        <filter-class>com.gyh.servlet.MyFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>character</filter-name>
        <url-pattern>/login</url-pattern>
        <url-pattern>/user</url-pattern>
    </filter-mapping>
</web-app>

过滤器的配置和Servlet的基本相同,不同点是Servlet属于单对单的映射关系,而过滤器属于一对多的映射关系。一个过滤器可以供给多个页面使用。

关于过滤器中的一些方法以及注意事项

  • servletRequest:该对象是相当于往Servlet中的对象发送一系列的请求,比如:
    • 调用其setCharacterEncoding(“UTF-8”); 可以对进入过滤器中的所有页面进行编码格式的转换。
  • 在处理完所有的逻辑之后,必须调用filterChain.doFilter方法来放行。因为进入过滤器之后相当于逻辑停滞,如果不放行的话是无法进行过滤之后的操作的。

Filter的生命周期

当Tomcat启动的时候,通过反射机制调用Filter的无参构造函数来创建实例化对象,同时调用init方法实现初始化。

doFilter方法调用多次。

当Tomcat关闭的时候,销毁Filter。

  • 无参构造函数:只调用一次,当Tomcat启动的时候调用(Filter一定要进行配置之后才可以调用)
  • init方法:只调用一次,当Filter的实例化对象创建完成之后调用
  • doFilter:调用多次,访问Filter的业务逻辑都写在Filter之中。
  • destory:只调用一次,Tomcat关闭时调用。

当同时配置多个Filter的时候,执行的顺序是由web.xml的顺序决定的。

也可以通过注解的方式来简化Web.xml的配置 @WebFilter(),但是,如果需要指定多个过滤器的执行顺序的话,那么就不能使用注解的方式来进行配置,因为使用注解的方式进行配置是无法来指定执行的顺序的。

实际开发中的使用场景

  • 统一处理中文乱码
  • 屏蔽敏感词
  • 控制资源的访问权限。

统一处理中文乱码


@WebFilter("/")
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("UTF-8");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

屏蔽敏感词

@WebFilter("/")
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 将敏感词替换成***
        String name = servletRequest.getParameter("name");
        System.out.println(name);
        name = name.replaceAll("敏感词","***");
        System.out.println(name);
    }
}

控制资源的访问权限

@WebFilter("/")
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 取出HttpRequest对象等,进行强转
        HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
        // 取出用来验证登录的session
        HttpSession session = httpServletRequest.getSession();
        String name = (String)session.getAttribute("name");
        if(name == null){
            // 不是登陆状态
            httpServletResponse.sendRedirect("/login.jsp");
        } else {
            // 是登陆状态 放行
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值