JAVA-Web Filter

Filter JAVA-Web过滤器

第一章 过滤器简介

1.1为什么要学习过滤器
在我们玩游戏时,或者在一些论坛的评论中,或者实在某个网页的注册 等中我们要输入,或者保存一些自己的见解,可能有些人难免会对其造成破坏,发表一些难听或者骂人的话,或者恶意注册一些用户名,这是需要我们后台工作者做一些限制(过滤),对一些基类的文字(骂人的话)给过滤掉,那么我们就可以用到简单方便的过滤器.
1.2什么是过滤器
java 自己提供了一个接口

java.servlet
Interface Filter
public interface Filter

过滤器是执行过滤任务的对象,这些任务是针对对某一资源(servlet 或静态内容)的请求或来自某一资源的响应执行的,抑或同时针对这两者执行。

Filter 用 doFilter 方法执行过滤。每个 Filter 都有对 FilterConfig 对象的访问权,可从该对象获得其初始化参数以及对它可以使用的 ServletContext 的引用,以便为过滤任务加载所需的资源。
Filter 是在 Web 应用程序的部署描述符中配置的。

已经标识用于此设计的示例是

  1. 验证过滤器
  2. 日志记录和审计过滤器
  3. 图像转换过滤器
  4. 数据压缩过滤器
  5. 加密过滤器
  6. 标记过滤器
  7. 触发资源访问事件的过滤器
  8. XSL/T 过滤器
  9. Mime 类型链过滤器

第二章简单使用过滤器

2.1首先了解一下Filter接口提供的三个方法
2.1.1第一个void init(FilterConfig filterConfig)
这个方法在服务器打开的时候就执行了

这个方法长得很像Servlet里的init 方法

但是与之不同的是创建时机:
Filter:服务器开启
Servlet:使用莫个servlet(默认情况下),我们也可以区修改servlet的创建时机在web.xml里的一个

<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup><!--这个方法 -->
    </servlet>
<load-on-startup>1</load-on-startup>

上面的方法可以修改servlet的创建时机

一般需要初始化的操作都在这里执行
需要知道的是我们可以通过filterconfig获得ServletContext对象 可以对域进行操作
filterConfig.getServletContext()

除此之外 filterConfig 还提供了其他三个方法分别获取web.xml的属性值

filterConfig.getFilterName();
filterConfig.getInitParameter();
filterConfig.getInitParameterNames();

@Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("我他妈初始化了");
        System.out.println(filterConfig.getFilterName());
        System.out.println(filterConfig.getInitParameter("yy"));
        System.out.println(filterConfig.getInitParameterNames().nextElement());
    }

这里对应的web.xml

<filter>
        <filter-name>FilterDemo01</filter-name>
        <filter-class>com.cn.cs.FilterDemo01.FilterDemo01</filter-class>
        <init-param>
            <param-name>yy</param-name>
            <param-value>yy</param-value>
        </init-param>
</filter>

    <filter-mapping>
        <filter-name>FilterDemo01</filter-name>
        <url-pattern>/FilterDemo01</url-pattern>
    </filter-mapping>
    

结果:

我他妈初始化了
FilterDemo01
yy
yy

2.1.2第二个void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {}
这里面提供三个参数

request在这里获取web浏览器发过来的请求
response在这里用于服务器发给web浏览器的相应
chain在这里用于是过滤满足需要放行(通过)
filterChain.doFilter(servletRequest,servletResponse);

2.1.3带三个void destroy() {}
销毁:过滤器与Servlet一致都是关闭服务器的时候自动销毁

第三章Filter和Servlet混合使用

这里写web.xml太麻烦了我就直接使用注解的方式

package com.cn.cs.FilterDemo01;

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

@WebFilter("/FilterDemo02")
public class FilterDemo02 implements Filter {
    public void destroy() {
        System.out.println("FilterDemo02 销毁了");
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("Filter执行了");
        chain.doFilter(req, resp);
        System.out.println("没有过滤器需要执行了 过滤器执行完毕");
    }

    public void init(FilterConfig config) throws ServletException {
        System.out.println("FilterDemo02 初始化");
    }

}

package com.cn.cs.FilterDemo01;

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

@WebServlet("/FilterDemo02")
public class FilterServlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("servlet执行了");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
      
    }
}

结果

FilterDemo02 初始化
[2019-10-07 03:50:05,138] Artifact Filter:war exploded: Artifact is deployed successfully
[2019-10-07 03:50:05,138] Artifact Filter:war exploded: Deploy took 588 milliseconds
Filter执行了
servlet执行了
没有过滤器需要执行了 过滤器执行完毕

在这里插入图片描述如果是多个过滤器那么就一个接着一个

3.2.1简单过滤文字

新建 骂人语句大全.txt 这里一个词占一行

骂人语句大全.txt

曹尼玛
尼玛币
狗屎
sb
王八蛋
王八
臭傻逼

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>

  <form action="${pageContext.request.contextPath}/FilterDemo03" method="post">
    请输入文字:<input type="text" name="str"/>
    <input type="submit" value="提交">
  </form>
  </body>
</html>

FilterDemo03.java

package com.cn.cs.FilterDemo03;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

@WebFilter("/FilterDemo03")
public class FilterDemo03 implements Filter {
    //创建List<String>集合
    private List<String> list = new ArrayList<>();
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        req.setCharacterEncoding("utf-8");
        String str = req.getParameter("str");

        for (String s : list) {
            if(str.contains(s)){
                System.out.println(s);
                resp.getWriter().write("输入脏话了");
                return;
            }
        }
        chain.doFilter(req, resp);
        resp.getWriter().write("输入话良好");
    }

    public void init(FilterConfig config) throws ServletException {

        try {
            //这里使用类加载器加载文件内容存储到List<String>集合中
            InputStream is = FilterDemo03.class.getClassLoader().getResourceAsStream("骂人语句大全.txt");
            //类型转换使用
            BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
            String str = null;
            while((str = br.readLine())!= null){
                System.out.println(str);
                    list.add(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

TestServlet.java (注意这个可写可不写 如果要是用form表单必须写 如果是在浏览器地址输入可省略不写)

package com.cn.cs.FilterDemo03;

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

@WebServlet("/FilterDemo03")
public class TestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

3.3多个过滤器执行原理

<filter>
        <filter-name>FilterDemo01</filter-name>
        <filter-class>com.cn.cs.FilterDemo04.FilterDemo01</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FilterDemo01</filter-name>
        <url-pattern>/demo01</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>FilterDemo02</filter-name>
        <filter-class>com.cn.cs.FilterDemo04.FilterDemo02</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FilterDemo02</filter-name>
        <url-pattern>/demo01</url-pattern>
    </filter-mapping>
package com.cn.cs.FilterDemo04;

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


public class FilterDemo02 implements Filter {
    public void destroy() {
        System.out.println("FilterDemo02销毁了");
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("FilterDemo02 执行了");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {
        System.out.println("FilterDemo02 初始化");
    }

}

package com.cn.cs.FilterDemo04;

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

public class FilterDemo01 implements Filter {
    public void destroy() {
        System.out.println("FilterDemo01销毁了");
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("FilterDemo01执行了");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {
        System.out.println("FilterDemo01初始化");

    }

}

FilterDemo02 初始化
FilterDemo01初始化
FilterDemo01执行了
FilterDemo02 执行了
FilterDemo02销毁了
FilterDemo01销毁了

谁在上面谁先执行

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值