一、概念
Filter 是依赖于 Servlet 容器,Filter接口就在 Servlet 包下面,属于 Servlet 规范的一部分。所以,很多时候我们也称其为“增强版 Servlet”。
过滤器的作用: 一般用于完成通用的操作。如:登录验证(就是只有登录了才给你看到一些重要的页面,没登录就不给你看,通过Filter完成)、统一编码处理、敏感字符过滤
过滤器给你这个请求通过的话,你就可以访问那个资源,不给你通过你就访问不了,可以在过滤器里面的类写给放不放行。(放行:filterChain.doFilter(servletRequest,servletResponse);)
二、快速入门
快速入门:
步骤:
- 定义一个类(普通java class就行),实现接口Filter(是javax.servlet.Filter包;)
- 复写方法
- 配置拦截路径
. web.xml
. 注解(用的比较多)(若不加注解也不加xml则这个不是过滤器了)
新建一个module,tomcat配置就不说,虚拟路径为bbb。
FilterDemo1 写:
package cn.itcast.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* @author QLBF
* @version 1.0
* @date 2020/12/1 15:50
*/
@WebFilter("/index.jsp")//只有访问index.jsp才会被拦截
public class FilterDemo1 implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("FilterDemo1执行了");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
index.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
index.jsp请求
</body>
</html>
如果设置为://@WebFilter("/*")//访问所有资源(浏览器访问htmi,jsp,servlet…)之前,都会执行该过滤器
这里只有加filterChain.doFilter(servletRequest,servletResponse);,浏览器访问index.jsp才会在浏览器显示index.jsp请求,否者不会再浏览器显示的
三、修改模板
然后直接新建一个Filter():
自动实现那个接口了,还加了个放行:
执行流程:
- 执行过滤器
- 执行放行后的资源
- 回来执行过滤器放行代码下边的代码
package cn.itcast.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* @author QLBF
* @version 1.0
* @date 2020/12/1 19:28
*/
@WebFilter("/*")
public class FilterDemo2 implements Filter {
public void destroy() {
System.out.println("destroy...");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("FilterDemo2执行了。。。");
//放行
chain.doFilter(req, resp);
System.out.println("FilterDemo2回来了。。。");
}
public void init(FilterConfig config) throws ServletException {
System.out.println("init...");
}
}
index.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
index.jsp请求
<%
System.out.println("index...");
%>
</body>
</html>
浏览器访问jsp后:
(bbb是虚拟目录)
四、过滤器链(就是配置多个过滤器的问题)
- 执行顺序:如果有两个过滤器:过滤器1和过滤器2
- 过滤器1
- 过滤器2
- 资源执行
- 过滤器2
- 过滤器1
- 过滤器先后顺序问题:
- 注解配置:按照**类名(而不是注解的)**的字符串比较规则比较,值小的先执行
- 如: AFilter 和 BFilter,AFilter就先执行了。(就是上面为什么过滤器1比过滤器二先执行,看类名,)
- web.xml配置: 谁定义在上边,谁先执行
自己创建两个Filter在doFilter写两句话,放行后也写句代码,浏览器访问统一效果,看它们的输出情况。(这里不放代码了,类的字符串值小的先执行,从第一个开始比,比到就暂停)