过滤器

Filter

  • 过滤器是服务端的代码
    用于拦截客户端传入的请求和服务端作出的响应。
  • 监视
    修改或以某种方式处理正在客户端和服务端之间交换的数据流。

在这里插入图片描述


如何使用

与Servlet类似,Filter是一个接口,实现了该接口的类就具备了过滤的功能,实际开发中,只需要自定义一个类,让该类实现Filter即可。


使用:
  1. 创建一个自定义的Java类,实现javax.servlet.Filter接口。
  2. 在web.xml配置被过滤器捕获的请求/响应的映射。生命周期与Servlet类似,有 init,doFilter,destroy。
  3. doFilter方法中执行完过滤器的逻辑之后,需要进行filterChain.doFilter(request,response)方法调用,否则请求/响应无法向后传递。
Filter的生命周期:
  1. tomcat服务启动之后,会创建Filter的实例化对象。

  2. 调用init方法完成初始化操作。

  3. 当服务器接收一个可以被Filter拦截的请求时,执行doFilter方法来完成具体的拦截处理逻辑。

  4. 关闭tomcat服务时,执行destroy方法释放当前Filter所占用的资源。

Filter生命周期方法:
  • 无参构造
    • 只执行一次,当tomcat启动时执行。
  • init
    • 只执行一次,Filter实例化对象创建完成时执行。
  • doFilter
    • 执行多次,每次拦截到请求或者响应都会执行。
  • destroy
    • 只执行一次,当tomcat关闭时执行。

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Character...");
        servletRequest.setCharacterEncoding("UTF-8");
        //必须添加下面这行代码,否则请求或响应被过滤器拦截之后,不再向后传递,只有调用了filterChain的doFilter方法之后才能继续传递
        filterChain.doFilter(servletRequest,servletResponse);
}

过滤器的应用


屏蔽用户敏感词

TestServlet
package com.chenny.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //此句话如果成功显示,则表明接收到了请求。
        System.out.println("Servlet接收到了请求   ");

        //取出传来的信息,进行显示查看。
        String text = (String) req.getAttribute("text");
        System.out.println(text);
    }
}

TestFilter
package com.chenny.filter;

import javax.servlet.*;
import java.io.IOException;

public class TestFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //此句话如果成功显示,则表明拦截成功
        System.out.println("拦截到了请求");

        //过滤器设置中文编码
        servletRequest.setCharacterEncoding("UTF-8");

        //得到add.jsp中的内容,进行过滤。
        String text = servletRequest.getParameter("text");

        //显示过滤之前的文本信息
        System.out.println("替换之前,: " + text);

        //将“敏感词”三字以“***”来代替
        text = text.replaceAll("敏感词","***");
        servletRequest.setAttribute("text",text);

        //显示替换之后的文本内容
        System.out.println("替换之后,: " + text);

        //调用filterChain,使之向后继续传递
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="test.do" method="post">
        <input type="text" name="text"/><br/>
        <input type="submit" value="发布"/>
    </form>
</body>
</html>
web.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">
    //TestServlet配置
    <servlet>
        <servlet-name>test</servlet-name>
        <servlet-class>com.chenny.controller.TestServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/test.do</url-pattern>
    </servlet-mapping>

    //过滤器配置
    <filter>
    <filter-name>testFilter</filter-name>
    <filter-class>com.chenny.filter.TestFilter</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>testFilter</filter-name>
    <url-pattern>/test.do</url-pattern>
    </filter-mapping>

</web-app>
返回过滤器应用

限制用户对某些资源的访问权限

思路: 过滤器拦截download.jsp,判断发出该请求的客户端对应的用户登录状态,如果是登录状态,放行,否则作出相应的处理:跳转到登录页面,让游客登录。

返回过滤器应用

返回目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值