客服人员在线session监听器

Listener类:
public class UserOnLineListener implements HttpSessionAttributeListener {
/**
* 定义监听的session属性名.
*/
public final static String LISTENER_NAME = "_loginSession";
/**
* 定义存储客户登录session的集合.
*/
@SuppressWarnings("unchecked")
private static List sessions = new ArrayList();
/**
* 加入session时的监听方法.
*
* @param HttpSessionBindingEvent
* session事件
*/
@SuppressWarnings("unchecked")
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
//System.out.println("被添加的名字是:"+se.getName());
//System.out.println("被添加的值是:"+se.getValue());
if (LISTENER_NAME.equals(se.getName())) {
sessions.add(se.getValue());
}
}
/**
* session失效时的监听方法.
*
* @param HttpSessionBindingEvent
* session事件
*/
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
//System.out.println("被销毁的名字是:"+se.getName());
//System.out.println("被销毁的值是:"+se.getValue());
if (LISTENER_NAME.equals(se.getName())) {
sessions.remove(se.getValue());
}
}
/**
* session覆盖时的监听方法.
*
* @param HttpSessionBindingEvent
* session事件
*/
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
}
/**
* 返回客户登录session的集合.
*
* @return
*/
@SuppressWarnings("unchecked")
public static List getSessions() {
return sessions;
}
}
java实体类:封装登录用户的信息
public final class OnLineSession implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 客户计算机的ip.
*/
private String ip = null;
/**
* 登录用户ID
*/
private String keyId=null;
/**
* 客户登录名. 客服工号
*/
private String loginId = null;
/**
* 客户登录系统时间.
*/
private String onlineTime = null;
/**
* 构造器.
* @param ip
* @param loginId
* @param onlineTime
*/
public OnLineSession(String ip,String keyId,String loginId,String onlineTime){
this.ip=ip;
this.keyId=keyId;
this.loginId=loginId;
this.onlineTime=onlineTime;
}
/**
* @return Returns the ip.
*/
public String getIp() {
return ip;
}
/**
* @param ip The ip to set.
*/
public void setIp(String ip) {
this.ip = ip;
}
/**
* @return Returns the loginId.
*/
public String getLoginId() {
return loginId;
}
/**
* @param loginId The loginId to set.
*/
public void setLoginId(String loginId) {
this.loginId = loginId;
}
/**
* @return Returns the onlineTime.
*/
public String getOnlineTime() {
return onlineTime;
}
/**
* @param onlineTime The onlineTime to set.
*/
public void setOnlineTime(String onlineTime) {
this.onlineTime = onlineTime;
}
public String getKeyId() {
return keyId;
}
public void setKeyId(String keyId) {
this.keyId = keyId;
}
}
web.xml配置Listener
<listener>
<listener-class>包路径.UserOnLineListener</listener-class>
<load-on-startup>1</load-on-startup>
<description>session监听器用户在线离线</description>
</listener>
在Action中重要的代码:
//记入session监听器
/**
* request.getRemoteAddr() 客户端的ip
*
*/
session.setAttribute(UserOnLineListener.LISTENER_NAME,
new OnLineSession(request.getRemoteAddr(),u.getUserId().toString(),u.getUserAccount(),new Date().toString()));
//取出记入session监听的值
HttpServletRequest request = ServletActionContext.getRequest();
List sessions = UserOnLineListener.getSessions();
List<OnLineSession> sessionList=new ArrayList<OnLineSession>();
if(sessions!=null){
OnLineSession onlineSession = null; //封装登录用户的对象
Iterator it = sessions.iterator();
while(it.hasNext()){
onlineSession=(OnLineSession)it.next();
sessionList.add(onlineSession);//登录用户的工号
//System.out.println("用户登录的工号的序号:"+onlineSession.getKeyId());
}
}
request.setAttribute("sessionList", sessionList);
在JSP中怎样判断在线离线
<s:iterator value="result.resultlist" var="user">
<!-- 页面级变量起控制作用 start 显示用户是否上下线问题 -->
<s:set name="onlineValue" value="0" />
<c:forEach items="${requestScope.sessionList}" var="online">
<c:if test="${online.keyId eq userId }">
<s:set name="onlineValue" value="1" />
</c:if>
</c:forEach>
<!-- 页面级变量起控制作用 stop -->
<s:if test="#onlineValue==1">在线</s:if>
<s:if test="#onlineValue!=1"> 离线</s:if>
用退出的时候也要清除一下session.removeAttribute(UserOnLineListener.LISTENER_NAME)这个,以及浏览器关闭的时候也要监听一下,将session值失效
浏览器关闭清除session值 javascript
/** 监听关闭浏览器的 清除session值 */
window.οnbefοreunlοad=function()
{
var warnning = '<fmt:message key="systemMessage.exitWarning" />';
var beforeExit='<fmt:message key="systemMessage.beforeExitWarning" />';
if(event.clientY<0 && event.clientX>document.body.clientWidth-20 || event.clientY<0 && event.clientX<20 ||
event.altKey || event.ctrlKey || event.clientY>document.body.clientHeight){
//alert(beforeExit);
//return warnning;
window.location ='${basePath}companyManage/user!loginOut.action';//进入后台清除session值的操作
}
}
说明:这种状况也不能非常的准确,尤其是浏览器关闭的时候有可能触发不到,哎,大体上可以满足的,呵呵!!!不过在web.xml中设置一个session失效时间为30分钟即可
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值