监听器的启动顺序:在一个web项目中可以有多个监听器,按照我们在web.xml中的注册顺序进行加载的。如果web.xml中同时注册有监听器,过滤器和servlet,加载顺序是监听器>过滤器>servlet
三种监听
ServletContextListener application
HttpSessionListener session
ServletRequestListener request
HttpSessionListener
注册都是在web.xml
<listener>
<listener-class>com.great.listener.FirstListerner</listener-class>
</listener>
public class FirstListerner implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
}
一个HttpSession可以注册多个HttpSessionListener接口,
一个web应用中可以有多个HttpSession对象
HttpSessionListener的主要用途:
统计在线人数
记录访问日志,记录访问时间、访问的ip
销毁session和session的声明周期息息相关
可以在web.xml配置session超时的时间
<session-config>
<session-timeout>10</session-timeout>
</session-config>
超时并不精准
被监听对象属性的增加或删除
Servlet中定义了以下三个接口:
ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener这三个接口分别实现了对ServletContext、HttpSession、ServletRequest对象的属性增、删的监听。
接口中定义了三个方法:
attributeAdded方法、attributeRemoved方法、attributeReplaced方法
例子:在线人数及ip地址等的统计(通过Sessionid去统计)
HttpSessionListener
package com.great.listener;
import java.util.List;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import com.great.entity.User;
import com.great.utils.SessionUtils;
public class OnlineNumListerner implements HttpSessionListener {
private int userNum;
@Override
public void sessionCreated(HttpSessionEvent se) {
userNum++;
//存入全局的web变量
se.getSession().getServletContext().setAttribute("userNum", "userNum");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
userNum--;
se.getSession().getServletContext().setAttribute("userNum", "userNum");
java.util.List<User> userList=null;
userList=(List<User>) se.getSession().getServletContext().getAttribute("list");
if (se.getSession().getId()!=null) {
userList.remove(SessionUtils.getUserBySessionId(userList, se.getSession().getId()));
}
}
}
由于要获取ip,而ip地址在Session中无法获取,在request中可以,想到ServletRequestListener
package com.great.listener;
import java.awt.List;
import java.util.ArrayList;
import java.util.Date;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import com.great.entity.User;
public class MyRequestListerner implements ServletRequestListener{
private java.util.List<User> userList;
@Override
public void requestDestroyed(ServletRequestEvent sre) {
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
userList=(java.util.List<User>) sre.getServletContext().getAttribute("list");
if (userList==null) {
userList=new ArrayList<User>();
}
//初始化的时候获取当前session的id
HttpServletRequest request=(HttpServletRequest) sre.getServletRequest();
String id = request.getSession().getId();
//当sessionid为空就添加
if(id==null){
User user=new User();
user.setSessionIdString(id);
//获取客户端的ip地址
user.setIpString(request.getRemoteAddr());
user.setFirstTimeString(new Date());
userList.add(user);
}
sre.getServletContext().setAttribute("list", userList);
}
}
用到的其他类
package com.great.utils;
import java.util.List;
import com.great.entity.User;
public class SessionUtils {
public static User getUserBySessionId(List<User> list,String sessionId){
for (int i = 0; i < list.size(); i++) {
User user=list.get(i);
if (sessionId.equals(user.getSessionIdString())) {
return user;
}
}
return null;
}
}
package com.great.entity;
import java.util.Date;
public class User {
private String sessionIdString;
private String ipString;
private Date firstTimeString;
public String getSessionIdString() {
return sessionIdString;
}
public void setSessionIdString(String sessionIdString) {
this.sessionIdString = sessionIdString;
}
public String getIpString() {
return ipString;
}
public void setIpString(String ipString) {
this.ipString = ipString;
}
public Date getFirstTimeString() {
return firstTimeString;
}
public void setFirstTimeString(Date firstTimeString) {
this.firstTimeString = firstTimeString;
}
}