public class LoginFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException,ServletException {
//TODO 处理逻辑,必须调用下面的方法
chain.doFilter(request,response);
}
}
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.lagou.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
package com.solider.filter;
import javax.servlet.*;
import java.io.IOException;
public class LifeFilter implements Filter {
public LifeFilter() {
System.out.println("构造方法!");
}
// 在启动服务器或者重新部署是执行
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化操作!");
}
// 每次请求都要执行一次
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("阻拦一起不合理的访问!");
filterChain.doFilter(servletRequest, servletResponse);
}
// 关闭服务器是执行
@Override
public void destroy() {
System.out.println("销毁操作!");
}
}
如果有多个过滤器都满足过滤的条件,则容器依据映射的先后顺序来调用各个过滤器。
<!-- 过滤器映射-->
<filter-mapping>
<filter-name>BFilter</filter-name>
<url-pattern>*.avi</url-pattern>
</filter-mapping>
package com.soldier.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("请求销毁了。。。。");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("创建请求。。。。");
}
}
package com.soldier.listener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
public class MyRequestAttributeListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("增加了属性:" + servletRequestAttributeEvent.getName());
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("属性" + servletRequestAttributeEvent.getName() + "被删除了!");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("修改了属性:" + servletRequestAttributeEvent.getName());
}
}
<Manager className="org.apache.catalina.session.PersistentManager"
saveOnRestart="true">
<!-- 配置文件存放的路径信息,可以自由指定 -->
<Store className="org.apache.catalina.session.FileStore"
directory="C:\session"/>
</Manager>
public class OnlineUser implements HttpSessionListener,ServletContextListener {
ServletContext ctx = null;
// 初始化ServletContext
public void contextInitialized(ServletContextEvent e) {
ctx = e.getServletContext();
}
// 销毁ServletContext
public void contextDestroyed(ServletContextEvent e) {
//将ServletContext设置成null;
}
// 当新创建一个HttpSession对象时
public void sessionCreated(HttpSessionEvent e) {
//将当前的在线人数加上1,并且保存到ServletContext(application)中
}
// 当一个HttpSession被销毁时(过期或者调用了invalidate()方法)
public void sessionDestroyed(HttpSessionEvent e) {
//将当前人数减去1,并且保存到ServletContext(application)中
}
}
<listener>
<listener-class> com.lagou.listener.OnlineUser </listener-class>
</listener>
package com.soldier.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class OnlineUser implements HttpSessionListener, ServletContextListener {
// 声明一个ServletContext类型的引用负责作为全局对象来记录当前用户的数量,通过属性记录
ServletContext servletContext = null;
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
servletContext = servletContextEvent.getServletContext();
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
servletContext = null;
}
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("有新用户上线了...");
Object count = servletContext.getAttribute("count");
// 若当前用户为第一个用户,则将全局对象中的属性值设置为1即可
if (null == count) {
servletContext.setAttribute("count", 1);
}
// 若当前用户不是第一个用户,则将全局对象中原有的数据取出来加1后在设置进去
else {
Integer integer = (Integer)count;
integer++;
servletContext.setAttribute("count", integer);
}
System.out.println("当前在线用户数量为:" + servletContext.getAttribute("count"));
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("有用户已下线...");
}
}
<%--
Created by IntelliJ IDEA.
User: Soldier
Date: 2021/8/21
Time: 15:36
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>显示当前在线用户的数量</title>
</head>
<body>
<h1>当前在线的人数为:${applicationScope.count}</h1>
</body>
</html>
原文:https://www.cnblogs.com/china-soldier/p/15169747.html