Java监听器

定义

  • 是Servlet规范定义的一种特殊类
  • 用于监听ServletContext,HttpSession,ServletRequest等域对象的创建,销毁及其属性修改发生变化的事件
  • 在时间发生前后进行一些必要的操作

实现步骤

  1. 编写java类实现监听器的接口,并且实现其接口方法
  2. 在web.xml文件中对实现的监听器类进行注册

监听器的实现过程:

1.编写java类实现监听器的接口,并且实现其接口方法 

Java监听器

不同接口的实现描述

  • ServletContextListener:监听ServletContext对象应用程序的创建和销毁,ServletContext生命周期的监听
  • HttpSessionListener:对会话对象的创建和销毁的监听
  • ServletRequestListener:对请求对象的创建和销毁的监听
  • ServletContextAttributeListener:对Servlet属性做监听
  • HttpSessionAttributeListener:对会话属性的变化事件进行监听
  • ServletRequestAttributeListener:对请求对象的属性进行监听
  • HttpSessionBindingListener:绑定到session中的某个对象的状态事件监听器(不需要在web.xml中进行绑定)

Java监听器

该接口有两个方法:

  • contextInitialized():完成对象初始化的监听,web程序启动时
  • contextDestroyed():对web程序的移除销毁,清理工作,防止资源的浪费

2.在web.xml文件中对实现的监听器类进行注册

Java监听器

运行看一看:可以看到web应用程序的创建和销毁过程

Java监听器


HttpSessionListener:对会话对象的创建和销毁的监听

Java监听器

Java监听器

先创建会话,然后会在1分钟后销毁创建id 

Java监听器

监听器案例

通过监听器实现web应用重复登陆,保证在同一个时间只有一个用户在进行登陆

  • 通过过滤器实现登陆控制,未登陆用户不能访问系统首页
  • 用户登录,将登录名存储到session中
  • 登录监听器监听session属性中登录属性的变化
  • 若登录用户用户名已经登录系统,清楚前次的登录信息

登录页面的设置

首先在login.jsp页面获取我们的用户值

Java监听器

然后将这个用户值显示到main.jsp页面中

Java监听器 Java监听器

运行看一看效果! 

Java监听器

Java监听器

登录权限过滤(由过滤器来实现)

  • 首先创造一个过滤器,并且进行实现

Java监听器

  • 记得需要在web.xml中进行映射的配置

Java监听器

  •  最后在index.jsp页面中,完成弹窗的响应

Java监听器

  • 运行看一看,当我们直接访问main.jsp页面时,会跳出弹窗,并且点击确定后,会自动重定向到登录页面 

Java监听器

用户信息存储实现(单例模式)

数据缓存,来存储用户的登录信息,进行登录信息的判断,查看是否有同样的数据进行了登录。

  • 首先,创建一个类,并将它修改为单例模式

HttpSession对象在创建后,都会有一个唯一的ID用于与其他的session做标志区别

Java监听器

                                        Java监听器                        Java监听器

功能类的总的实现代码:

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。

Java监听器

记得在web.xml中进行注册哦 

Java监听器

 

 

 

 

 

 

 

 

 

 

 

上一篇:说一下 session 的工作原理?


下一篇:Servlet的会话机制?