简介:
JavaWeb三大组件:
Servlet、Listener(2个感知监听不需要配置)、Filter。(都需要在web.xml中进行配置)
过滤器:
javax.servlet.Filter:
一般是在资源(Jsp,Servlet,.css,.html等等)之前执行;
可以使请求得到目标资源,也可以阻止请求得到目标资源;
- 过滤器有拦截的功能!
过滤器的实现:
1、创建一个类实现Filter接口;
2、在web.xml中配置
Filter三个方法(生命周期):
/** * 创建之后立即执行,用来做初始化,Filter在服务器启动时就创建 */ public void init(FilterConfig filterConfig) throws ServletException { } /** * 每次过滤时都会执行 */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { } /** * 销毁之前执行,用来对非内存资源进行释放 */ public void destroy() { }
服务器启动就创建:
Filter是单例的,和Servlet一样!
web.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>day0412_1</display-name>
<filter>
<filter-name>AFilter</filter-name> <!-- 自定义名称 -->
<filter-class>demoFilter.AFilter</filter-class> <!-- Filter类所在路径 -->
</filter>
<filter-mapping>
<filter-name>AFilter</filter-name> <!-- 自定义名称匹配 -->
<url-pattern>/*</url-pattern> <!-- 拦截的文件路径 -->
</filter-mapping>
</web-app>
创建一个AServlet来实验:
package demo1;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("------Aervlet-----");
}
}
操作开始:
当我们访问创建的AServlet时,并不会输出AServlet中的内容,而是输出的AFilter中的内容:
Filter参数:
1、FilterConfig:等同Servlet的ServletConfig
一个过滤器配置对象,servlet容器在初始化期间使用它将信息传递给过滤器。
public interface FilterConfig
获取初始化参数:public java.util.Enumeration<java.lang.String> getInitParameter()
获取Filter名称:public java.lang.String getFilterName()
获取ServletContext对象:public ServletContext getServletContext()
2、FilterChain:
FilterChain是servlet容器提供给开发人员的一个对象,它提供了资源过滤请求的调用链的视图。筛选器使用FilterChain来调用链中的下一个筛选器,或者如果调用筛选器是链中的最后一个筛选器,则调用链末端的资源。
public interface FilterChain
FilterChain只有一个方法:
这个方法与Filter中的方法名称一样,但是参数不一样。
对拦截的目标进行放行通过:public void doFilter(ServletRequest request,ServletResponse response) throws java.io.IOException,ServletException
此时添加了chain.doFilter()方法后再访问AServlet:
拦截成功,但是也放其通过。
放行就相当于调用了目标资源(Servlet)的service()方法。
访问其它资源:
这里有一个jsp文件:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="ISO-8859-1"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>my index.jsp</title>
</head>
<body>
<% System.out.println("This is a apple!!!!!"); %>
<h1>This is a JSP named index.jsp!!</h1>
</body>
</html>
随后在浏览器访问这个jsp文件:
这里有内容输出,但是是因为我们进行了放行操作,查看控制台:
放行Servlet相当于执行service()方法,那么放行JSP就相当于执行服务器中的一个index.jsp.class编译文件,这个文件中包含了jsp中的可执行代码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)