目录
一、过滤器概述
1.1、什么是过滤器?
Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener监听器、Filter过滤器。
Filter 过滤器它是 JavaEE 的规范。也就是接口,它的作用是:拦截请求,过滤响应。
1.2、过滤器的作用
过滤器是一种用于过滤或处理数据的工具。它的作用是从原始数据中选择出某些内容,把其它不需要的内容从数据中剔除或隐藏。过滤器可以应用于各种类型的数据,例如文本、图像、音频和视频等。
在计算机中,过滤器通常用于以下方面:
1. 数据处理:通过过滤器可以对数据进行加工、过滤、转换、排序等操作,以满足用户的需求。比如在 Excel 中使用筛选功能就是一种过滤器。
2. 数据安全:过滤器可以用于检测并防止恶意软件、病毒、垃圾邮件等危害信息安全的内容进入系统或网络。
3. 网络通信:网络通信中的过滤器比较常用,用于过滤和拦截网络数据包,保证网络安全。
4. 信息检索:在搜索引擎中,过滤器可以过滤掉不相关的结果,提高搜索效率和准确性。
总之,过滤器是一种广泛应用的工具,可以帮助我们快速、有效地处理各种数据和信息。
1.3、过滤器的生命周期
初始化:在Web应用程序启动时创建Filter实例,并调用init方法进行初始化设置。
过滤请求:当用户请求到达Web应用程序时,容器会调用Filter的doFilter方法,对请求进行处理和过滤。
转发请求:如果Filter将请求转发给另一个资源(如Servlet或JSP),则容器会暂停Filter的执行,并将请求转发给下一个资源。
请求处理:资源执行完请求并生成响应后,容器会恢复Filter的执行,并调用doFilter方法进行后续处理。
销毁:当Web应用程序关闭或卸载时,容器会调用Filter的destroy方法,释放资源和执行清理操作。
在以上步骤中,Filter的init和destroy方法只会在创建和销毁Filter实例时执行一次,而doFilter方法会在每次请求到达时都执行。
1.4、Filter拦截路径配置
拦截路径表示 Filter 会对请求的哪些资源进行拦截,使用 @WebFilter 注解进行配置。如:@WebFilter("拦截路径")
拦截路径有如下四种配置方式:
拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截
目录拦截:/user/*:访问/user下的所有资源,都会被拦截
后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
拦截所有:/*:访问所有资源,都会被拦截
通过上面拦截路径的学习,大家会发现拦截路径的配置方式和 Servlet 的请求资源路径配置方式一样,但是表示的含义不同。
1.5、 实例
1.5.1、字符编码
我们编写 CharsetFilter类,统一在过滤器的doFilter() 方法中设置好编码为 UTF-8。
package com.school.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* 设置编码
*/
@WebFilter("/*")
public class CharsetFilter implements Filter{
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
filterChain.doFilter(servletRequest,servletResponse);
}
}
1.5.2 、登录编码
我们编写FilterDemo类,统一在过滤器的doFilter()方法中设置好登录判断。
package com.org.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* 登录过滤
*/
@WebFilter("/*")
public class FilterDemo implements Filter{
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
String uri = request.getRequestURI();
if (uri.contains("login") || uri.contains("Login")){
filterChain.doFilter(request,response);
}else {
HttpSession session = request.getSession();
String username = (String)session.getAttribute("username");
if (username == null){
request.getRequestDispatcher("/loginfail.jsp").forward(request,response);
}else {
filterChain.doFilter(request,response);
}
}
}
}
二、监听器概述
2.1、什么是监听器?
JavaWeb中的监听器(Listener)是一种事件机制,用于在应用程序运行时监听某些事件的发生,通常用于初始化、销毁、维护等操作。
2.2、监听器的分类
ServletContextListener(全局上下文监听器):监听 ServletContext 对象的创建和销毁事件,可以在应用程序启动时进行初始化操作,如加载配置文件等,也可以在应用程序停止时进行销毁操作。
HttpSessionListener(会话监听器):监听 HttpSession 对象的创建和销毁事件,可以在用户会话开始时进行操作,如创建用户登录日志等,也可以在用户会话结束时进行清理操作。
ServletRequestListener(请求监听器):监听 HttpServletRequest 对象的创建和销毁事件,可以在每个请求到达时进行相关操作,如记录请求日志等。
2.3、监听器的生命周期
初始化阶段(Initialization):当容器加载Web应用程序时,会创建监听器的实例,并调用其init()方法进行初始化,可以在此阶段完成一些初始化工作。
事件处理阶段(Event Handling):在Web应用程序运行期间,当某个事件发生时,监听器会被触发,并调用相应的回调方法来处理事件。例如,ServletContextAttributeListener 监听器可以监听 ServletContext 属性的变化,当其属性值发生变化时,就会触发相应的回调方法。
销毁阶段(Destroy):当Web应用程序关闭时,容器会调用监听器的destroy()方法销毁监听器实例。可以在此阶段完成一些资源释放等清理工作。
2.4、实例
package com.org.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class VisitorListener implements HttpSessionListener{
private static long totalCount = 0;
@Override
public void sessionCreated(HttpSessionEvent se) {
totalCount++;
System.out.println("在线人数:" + totalCount);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
totalCount--;
}
}