1、创建一个sessionBean类,用来封装session里面自己需要的参数,将其封装成对象;
package com.lh.bean;
import java.io.Serializable;
import java.util.Calendar;
import javax.servlet.http.HttpSession;
import com.mbpsoft.shop.common.BussinessUtil;
import com.mbpsoft.shop.entity.Admin;
public class SessionBean implements Serializable {
private static final long serialVersionUID = -7519486823153844426L;
private String sessionid; // 会话编号
private String creationTime;// 创建时间
private Admin admin;//登录人
private HttpSession session;
private Calendar cal = Calendar.getInstance();
public SessionBean(HttpSession session,Admin admin ){
this.sessionid = session.getId();
cal.setTimeInMillis(session.getCreationTime());
this.creationTime = BussinessUtil.time2String(cal.getTime());
this.session = session;
this.admin = admin;
}
public String getSessionid() {
return sessionid;
}
public void setSessionid(String sessionid) {
this.sessionid = sessionid;
}
public String getCreationTime() {
return creationTime;
}
public void setCreationTime(String creationTime) {
this.creationTime = creationTime;
}
//最后运行时间
public String getLastAccessedTime() {
cal.setTimeInMillis(this.session.getLastAccessedTime());
return BussinessUtil.time2String(cal.getTime());
}
//可以得到用户实时的在线时长
@SuppressWarnings("finally")
public String getAccessedTime() {
String time = "";
try {
time = (Calendar.getInstance().getTimeInMillis()-this.session.getCreationTime())/1000/60+"";
} catch (Exception e) {
//BussinessUtil.sessionBeans.remove(this.admin.getId());
//BussinessUtil.sessions.remove(this.admin.getId());
this.session = null;
time = "∞";
} finally {
return time;
}
}<pre name="code" class="java"><span style="white-space:pre"> </span>@SuppressWarnings("finally")
public String getWaitingTime() {
String time = "";
try {
time = (Calendar.getInstance().getTimeInMillis()-this.session.getLastAccessedTime())/1000/60+"";
} catch (Exception e) {
//BussinessUtil.sessionBeans.remove(this.admin.getId());
//BussinessUtil.sessions.remove(this.admin.getId());
this.session = null;
time = "∞";
} finally {
return time;
}
}
public HttpSession getSession() {
return session;
}
public void setSession(HttpSession session) {
this.session = session;
}
@SuppressWarnings("finally")
public int getIsValitate(){
long time = 0l;
int flag = 0;
try {
if(this.session == null){
flag = 2;
}else{
time = (Calendar.getInstance().getTimeInMillis()-this.session.getLastAccessedTime())/1000/60;
if(time>20)
flag = 1;
else
flag = 0;
}
} catch (Exception e) {
flag = 2;
} finally {
return flag;
}
}
}
2、定义一个全局静态变量sessionBeans(key为当前用户编号,value为用户登录系统建立的会话),在用户登录成功进行权限加载时,将该用户会话存入sessionBeans;
public static Map<String,SessionBean> sessionBeans = new HashMap<String, SessionBean>();
3、将sessionBeans放入session里,方便在前台页面进行用户管理;
getServletContext().setAttribute("sessionBeans", sessionBeans);
4、通过spring来进行定时执行任务,进行会话管理
package com.lh.quartz;
import java.util.Iterator;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.mbpsoft.shop.bean.SessionBean;
import com.mbpsoft.shop.common.BussinessUtil;
import com.mbpsoft.shop.service.AdminService;
public class QuartzJob {
@Resource(name="synchronizeDataServiceImpl")
private SynchronizeDataService synchronizeDataService;
@Resource(name = "adminServiceImpl")
private AdminService adminService;
public Log log = LogFactory.getLog(this.getClass());
public void checkSession() {
Map<String,SessionBean> map = BussinessUtil.sessionBeans;
Iterator<String> keyIterator = map.keySet().iterator();
try {
while(keyIterator.hasNext()){
String key = keyIterator.next();
SessionBean sessionBean = map.get(key);
int flag = sessionBean.getIsValitate();
if(flag>0){
adminService.deleteRightOnTime(sessionBean.getSessionid());
BussinessUtil.sessionBeans.remove(key);
BussinessUtil.sessions.remove(key);
if(flag>1){
log.info("注销用户:"+key+"异常用户");
}else{
log.info("注销用户:"+key+"超时用户");
sessionBean.getSession().invalidate();
}
}
}
} catch (Exception e) {
log.info("用户已异常注销");
checkSession();
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<bean id="quartzJob" class=" com.mbpsoft.shop.quartz.QuartzJob"/>
<bean id="checkSession" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="quartzJob"></property>
<property name="targetMethod" value="checkSession"></property>
<property name="concurrent" value="false"/>
</bean>
<bean id="cronTriggerSession" lazy-init="false" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!--每20分钟执行一次-->
<property name="jobDetail" ref="checkSession"></property>
<property name="cronExpression" value="0 0/20 * * * ? "></property>
</bean>
<!-- 设置调度 -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
<property name="triggers">
<list>
<ref bean="cronTriggerSession"/>
</list>
</property>
<property name="autoStartup" value="true"/>
</bean>
</beans>
5、最终展示页面如下,方便随时管理在线用户