Filter&Listener
JavaWeb三大组件:Servlet、Filter、Listener
Filter
过滤器,用来过滤网站的数据,如处理中文乱码、登录验证等。
开发步骤
1、定义类,实现Filter接口,重写其所有方法
package com.louis.filter;
import javax.servlet.*;
import java.io.IOException;
/**
* @author XRY
* @date 2023年05月12日20:57
*/
public class FilterDemo01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}
需要注意的是在类库中有很多类名为Filter的类,我们需要导入下面的类:
2、配置Filter拦截资源的路径
在类上定义@WebFilter注解或在web.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"
metadata-complete="true">
<filter>
<filter-name>/test</filter-name>
<filter-class>com.louis.filter.FilterDemo01</filter-class>
</filter>
<filter-mapping>
<filter-name>/test</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<display-name>Archetype Created Web Application</display-name>
</web-app>
3、在doFilter方法中将过滤器放行
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("FilterDemo...");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
执行逻辑:执行放行前逻辑---->放行---->访问资源---->执行放行后的逻辑。放行前对request数据进行处理,放行后对response的数据进行处理。
Filter使用细节
Filter拦截路径配置
Filter可以根据使用的场景及细节,配置不同的资源拦截路径。@WebFilter(“/*”)
- 拦截具体的资源:/index.jsp,只访问index.jsp时才会被拦截
- 目录拦截:/user/*,访问/uder下的所有资源,都会被拦截
- 后缀名拦截:.jsp,访问后缀名为jsp的资源,都会被拦截
- 拦截所有:/*,访问所有资源,都会被拦截
过滤器链
一个web应用,可以配置多个过滤器,多个过滤器称为过滤器链。
其中的顺序为:
执行
Filter1
的放行前逻辑代码----->执行Filter2
的放行前逻辑代码----->访问到资源----->执行Filter2
的放行后逻辑代码----->执行Filter1
的放行后逻辑代码
Listener
监听器(Listener)可以监听在application,session, request三大对象创建、销毁或者往其中添加删除的属性的自动执行代码块的功能组件。
开发步骤
1、实现监听器接口
package com.louis.listen;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* @author XRY
* @date 2023年05月10日12:44
*/
//统计在线人数:统计session
public class OnlineCountListener implements HttpSessionListener {
//创建session监听:看你的一举一动
//一旦创建session就会触发一次
@Override
public void sessionCreated(HttpSessionEvent se) {
ServletContext context = se.getSession().getServletContext();
Integer onlineCount = (Integer)context.getAttribute("OnlineCount");
if(onlineCount == null){
onlineCount = 1;
}else{
int count = onlineCount.intValue();
onlineCount = count +1;
}
context.setAttribute("onlineCount", onlineCount);
}
//销毁session监听
//一旦销毁session就会触发这个事件
@Override
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext context = se.getSession().getServletContext();
Integer onlineCount = (Integer)context.getAttribute("OnlineCount");
if(onlineCount == null){
onlineCount = 0;
}else{
int count = onlineCount.intValue();
onlineCount = count - 1;
}
context.setAttribute("onlineCount", onlineCount);
}
}
2、配置监听器
<listener>
<listener-class>com.louis.listen.OnlineCountListener</listener-class>
</listener>
种类
JavaWeb提供了8个监听器。