定义
- 是Servlet规范定义的一种特殊类
- 用于监听ServletContext,HttpSession,ServletRequest等域对象的创建,销毁及其属性修改发生变化的事件
- 在时间发生前后进行一些必要的操作
实现步骤
- 编写java类实现监听器的接口,并且实现其接口方法
- 在web.xml文件中对实现的监听器类进行注册
监听器的实现过程:
1.编写java类实现监听器的接口,并且实现其接口方法
不同接口的实现描述
- ServletContextListener:监听ServletContext对象应用程序的创建和销毁,ServletContext生命周期的监听
- HttpSessionListener:对会话对象的创建和销毁的监听
- ServletRequestListener:对请求对象的创建和销毁的监听
- ServletContextAttributeListener:对Servlet属性做监听
- HttpSessionAttributeListener:对会话属性的变化事件进行监听
- ServletRequestAttributeListener:对请求对象的属性进行监听
- HttpSessionBindingListener:绑定到session中的某个对象的状态事件监听器(不需要在web.xml中进行绑定)
该接口有两个方法:
- contextInitialized():完成对象初始化的监听,web程序启动时
- contextDestroyed():对web程序的移除销毁,清理工作,防止资源的浪费
2.在web.xml文件中对实现的监听器类进行注册
运行看一看:可以看到web应用程序的创建和销毁过程
HttpSessionListener:对会话对象的创建和销毁的监听
先创建会话,然后会在1分钟后销毁创建id
监听器案例
通过监听器实现web应用重复登陆,保证在同一个时间只有一个用户在进行登陆
- 通过过滤器实现登陆控制,未登陆用户不能访问系统首页
- 用户登录,将登录名存储到session中
- 登录监听器监听session属性中登录属性的变化
- 若登录用户用户名已经登录系统,清楚前次的登录信息
登录页面的设置
首先在login.jsp页面获取我们的用户值
然后将这个用户值显示到main.jsp页面中
运行看一看效果!
登录权限过滤(由过滤器来实现)
- 首先创造一个过滤器,并且进行实现
- 记得需要在web.xml中进行映射的配置
- 最后在index.jsp页面中,完成弹窗的响应
- 运行看一看,当我们直接访问main.jsp页面时,会跳出弹窗,并且点击确定后,会自动重定向到登录页面
用户信息存储实现(单例模式)
数据缓存,来存储用户的登录信息,进行登录信息的判断,查看是否有同样的数据进行了登录。
- 首先,创建一个类,并将它修改为单例模式
HttpSession对象在创建后,都会有一个唯一的ID用于与其他的session做标志区别
功能类的总的实现代码:
package com.kilig.cache;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
public class LoginCache {
//首先将类修改为单例模式的类
//1.构造器的私有化
//2.定义静态变量
private static LoginCache instance =new LoginCache();
//定义集合存储缓存信息,首先将用户登录名和SessionID进行关联
private Map<String, String> loginUserSession =new HashMap<String, String>();
//在存储SessionID和session会话本身映射集合
private Map<String, HttpSession> loginSession =new HashMap<String, HttpSession>();
private LoginCache() {
}
//3.定义静态方法获取对象的实例
public static LoginCache getInstance() {
return instance;
}
//封装方法,操纵集合
public String getSessionIdByUsername(String username) {
return loginUserSession.get(username);//通过用户名获取集合中对应的NID
}
public HttpSession getSessionBySessionId(String sessionId) {
return loginSession.get(sessionId);//通过SessionId获得Session对象
}
//存储功能处理
public void setSessionIdByUsername(String username, String sessionId) {
loginUserSession.put(username, sessionId);//存储username,sessionId到会话缓存中
}
public void setSessionBySessionId(String sessionId, HttpSession session) {
loginSession.put(sessionId, session);//存储sessionId,session到会话缓存中
}
}
监听功能实现
当session属性创建后,就是用户第一次访问web应用。用户可能只访问了登录界面,而并没有进行登录操作,此时监听到了会话的创建,但是对登录操作来说是没有任何意义的。
因此我们采用的是属性的监听器。此时我们监听的就是loginUser,当user被创建时,此时就表示我们的用户进行了登录。因此就使用HttpSessionAttributeListener。
记得在web.xml中进行注册哦