目录
1、编写一个类并实现javax.Servlet.Filter接口。
一、JavaWeb的核心三大组件。
(1)Servlet。
用于处理客户端的请求。
Servlet是JavaWeb应用的基础。它提供了一种方式来接收HTTP请求、执行特定操作(如业务逻辑处理、数据库交互等),并返回响应给客户端。
(2)Filter。
- 用于拦截请求或响应。
- Filter可以对进入的请求进行预处理,或者对出去的响应进行后处理。它们可以用于实现如日志记录、请求过滤、数据压缩、响应修改等功能。
(3)Listener。
- 用于监听应用、会话或请求的生命周期事件。
- Listener允许开发者在特定的事件发生时执行代码。例如在应用启动或关闭时、会话创建或销毁时、或者请求被发送到服务器时。
二、过滤器(Filter)原理。
(1)基本介绍。
- 过滤器JavaWeb三大组件之一,它与Servlet很相似!然而过滤器是用来拦截请求的,而不是处理请求的。
- 在JavaWeb应用中,过滤器(Filter)是一种用于在请求到达Servlet之前或响应返回给客户端之前,对请求和响应进行预处理和后处理的组件。
- 过滤器的工作原理基于"过滤"的概念。即它们可以检查、修改、甚至拒绝或允许请求和响应。
(2)图解介绍。
- 当用户请求某个Servlet时,会先执行部署在这个请求上的过滤器(Filter)。
- 如果Filter"放行",那么会继续执行用户请求的Servlet。
- 如果Filter"不放行",那么就不会执行用户请求的Servlet。
(3)过滤器(Filter)生命周期。
1、查阅javaEE文档。
2、有关生命周期的三个方法。
init(FilterConfig对象)。
在服务器启动时会创建Filter实例,并且每个类型的Filter只创建一个实例,从此不再创建!在创建完Filter实例后,会马上调用init()方法完成初始化工作,这个方法只会被执行一次(完成资源的初始化工作。如:读取配置参数、建立数据库连接等)。
doFilter(ServletRequest req,ServletResponse res,FilterChain chain)。
这个方法会在用户每次访问目标资源的url(路径)时执行。如果需要"放行",那么需要调用FilterChain对象的doFilter()方法。如果不调用FilterChain的doFilter()方法,那么目标资源将无法执行。
destroy()。
服务器会在创建Filter对象之后,把Filter放到缓存中一直使用,通常不会销毁它。一般会在服务器关闭时销毁Filter对象,在销毁Filter对象之前,服务器会调用Filter对象的destory()方法。
(4)如何实现过滤器?
1、编写一个类并实现javax.Servlet.Filter接口。
- 注意该接口中有两个默认方法。init()、destory()方法。
- 注意Filter对象在服务器启动时就会创建。
2、重写拦截请求方法doFilter()。
- 自编写的AFilter类完成第1步与第2步。
- 下面就是实现javax.Servlet.Filter接口并重写了三个生命周期方法的类的代码。
javapackage com.fs.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; /** * @Title: AFilter * @Author HeYouLong * @Package com.fs.filter * @Date 2024/11/29 上午10:12 * @description: 拦截器A类实现Filter接口 */ public class AFilter implements Filter { /** * 生命周期方法,过滤器创建之后马上调用(服务器),只执行一次 * @param filterConfig * @throws ServletException */ @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("myfilter 出生..."); } /** * 生命周期方法,过滤器销毁之前调用(服务器),只执行一次 */ @Override public void destroy() { System.out.println("myfilter 销毁..."); } /** * 生命周期方法,请求的url被过滤器拦截的,每请求一次,doFilter()方法就会执行一次 * @param servletRequest 父类请求对象 * @param servletResponse 父类响应对象 * @param filterChain 过滤器链对象 * @throws IOException * @throws ServletException */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("Filter..."); //放行当前拦截 filterChain.doFilter(servletRequest, servletResponse); } }
3、给过滤器进行配置,配置拦截的url(路径)。
- 如果没有配置拦截的url。那么过滤器将不起作用!
- 下面将学习如何配置过滤器。
(5)过滤器的配置方式。
1、第一种方式------XML配置方式。
- 在我们的项目的web目录下的"web.xml"文件进行配置。
- 与配置Servlet很像。<filter>标签、<filter-mapping>标签。
- <filter-class>标签直接复制自编写类的全类名。
- 下面的两种方法都可以。
- XML文件中的所有内容。
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"> <!--配置Filter--> <filter> <!--filter-name是起个名字--> <filter-name>AFilter</filter-name> <filter-class>com.fs.filter.AFilter</filter-class> </filter> <!--映射--> <filter-mapping> <filter-name>AFilter</filter-name> <!-- 拦截的url 一般与通配符*一起使用 --> <!-- 拦截所有请求:/* 包括静态资源 --> <!-- 前缀匹配:/abc/* --> <!-- 后缀匹配:*.后缀名 --> <url-pattern>/*</url-pattern> <!-- 拦截指定名称的Servlet: <servlet-name>xxxServlet</servlet-name> --> </filter-mapping> </web-app>
- 启动工程,测试是否拦截成功。
- 放行本次拦截。使用过滤器链对象的doFilter()方法。
2、过滤器链原理。
- 过滤器链的图解。
3、第二种方式------注解配置方式。
- 在编写的过滤器类上加注解@WebFilter("需拦截的url")。
4、多个过滤器的执行顺序。
使用XML时由标签<filter-mapper>的先后位置决定!
使用注解时:由类的位置决定!
- 在JavaWeb中该注解一直没有得到解决。但是在后面的springboot的框架学习时,就有过滤器的一个参数(设置过滤器的执行顺序!)
(6)过滤器的拦截方式与配置错误页面。
- 配置错误信息:就是当系统服务器出现异常时,拦截器执行并跳转到指定的错误页面(error.jsp)这样既能减轻服务器的压力,也能提高用户的体验!
- XML(web.xml)配置文件内容。
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"> <!--配置错误页面--> <error-page> <!--错误状态码--> <error-code>500</error-code> <!--异常类型--> <!-- <exception-type></exception-type>--> <!--错误页面路径--> <location>/error.jsp</location> </error-page> </web-app>
- error.jsp页面。
html<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>错误页面</title> </head> <body> <%=response.getStatus()%> <h1>系统出错了,请联系管理管理员!!</h1> </body> </html>