Filter JAVA-Web过滤器
第一章 过滤器简介
1.1为什么要学习过滤器
在我们玩游戏时,或者在一些论坛的评论中,或者实在某个网页的注册 等中我们要输入,或者保存一些自己的见解,可能有些人难免会对其造成破坏,发表一些难听或者骂人的话,或者恶意注册一些用户名,这是需要我们后台工作者做一些限制(过滤),对一些基类的文字(骂人的话)给过滤掉,那么我们就可以用到简单方便的过滤器.
1.2什么是过滤器
java 自己提供了一个接口
java.servlet
Interface Filter
public interface Filter
过滤器是执行过滤任务的对象,这些任务是针对对某一资源(servlet 或静态内容)的请求或来自某一资源的响应执行的,抑或同时针对这两者执行。
Filter 用 doFilter 方法执行过滤。每个 Filter 都有对 FilterConfig 对象的访问权,可从该对象获得其初始化参数以及对它可以使用的 ServletContext 的引用,以便为过滤任务加载所需的资源。
Filter 是在 Web 应用程序的部署描述符中配置的。
已经标识用于此设计的示例是
- 验证过滤器
- 日志记录和审计过滤器
- 图像转换过滤器
- 数据压缩过滤器
- 加密过滤器
- 标记过滤器
- 触发资源访问事件的过滤器
- XSL/T 过滤器
- 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销毁了
谁在上面谁先执行