实现思路:
SessionListener监听session的创建与销毁
ServletContext中维护用户访数据,
1. 用户登陆:
用户登陆操作成功时,把用户ID sessionID以及其他需要的信息存放到ServletContext
2. 用户退出:
a.正常退出:销毁session 移除ServletContext里的用户信息
b.非正常退出:设置session有效时间,监听器监听session状态,session失效时, 移除ServletContext
里的用户信息
具体实现:
SessionListener
@WebListener
public class UserSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
// 设置session失效时间
se.getSession().setMaxInactiveInterval(60 * 60);
}
/*
* 用户非正常退出时 session失效销毁,移除用户在ServletContext中Map里的信息 ,并修改用户状态(non-Javadoc)
*
* @see
* javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.
* HttpSessionEvent)
*/
@Override
public void sessionDestroyed(HttpSessionEvent se) {
destroyed(se);
}
@SuppressWarnings("unchecked")
private synchronized void destroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
ServletContext application = session.getServletContext();
String sessionId = session.getId();
Map<Integer, String> userSessions = (Map<Integer, String>) application.getAttribute("userSessions");
if (userSessions != null && !userSessions.isEmpty() && !StringUtils.isEmpty(sessionId)) {
Iterator<Integer> iterator = userSessions.keySet().iterator();
while (iterator.hasNext()) {
Integer uid = iterator.next();
if (sessionId.equals(userSessions.get(uid))) {
// 移除用户信息
iterator.remove();
// 修改用户状态为离线
IMService imservice = (IMService) WebApplicationContextUtils.getWebApplicationContext(application)
.getBean(IMService.class);
LUserService lUserService = (LUserService) WebApplicationContextUtils
.getWebApplicationContext(application).getBean(LUserService.class);
IMUser imuser = new IMUser(uid, "offline");
imservice.updateByPrimaryKeySelective(imuser);
// 修改用户退出时间
T_User user = new T_User();
user.setUid(uid);
user.setExitTime(new Date());
lUserService.updateExitTime(user);
System.err.println("用户退出,在线人数:" + userSessions.size());
}
}
}
}
}
SessionUtil
public class SessionUtils {
private static class SessionUtil {
private static final SessionUtils INSTANCE = new SessionUtils();
}
private SessionUtils() {
}
public static SessionUtils getInstance() {
return SessionUtil.INSTANCE;
}
/**
* 用户登陆 把用户ID 和 sessionId 添加到 Map userSessions中
*
* @param session
* @param uid
*/
@SuppressWarnings("unchecked")
public synchronized void setSession(HttpServletRequest request, Integer uid) {
HttpSession session = request.getSession();
ServletContext application = getServletContext(session);
Map<Integer, String> userSessions = (Map<Integer, String>) application.getAttribute("userSessions");
if (userSessions == null) {
userSessions = new HashMap<>();
userSessions.put(uid, session.getId());
application.setAttribute("userSessions", userSessions);
} else {
userSessions.put(uid, session.getId());
}
System.err.println("用户登陆,在线人数:" + userSessions.size());
PageViewUtils.getInstance().setNum(request, uid);
}
synchronized ServletContext getServletContext(HttpSession session) {
return session.getServletContext();
}
@SuppressWarnings("unchecked")
public synchronized void invalidateSession(HttpSession session) {
ServletContext application = getServletContext(session);
String key = session.getId();
Map<Integer, String> userSessions = (Map<Integer, String>) application.getAttribute("userSessions");
if (userSessions != null && !userSessions.isEmpty() && !StringUtils.isEmpty(key)) {
Iterator<Integer> iterator = userSessions.keySet().iterator();
while (iterator.hasNext()) {
Integer keys = iterator.next();
if (key.equals(userSessions.get(keys))) {
iterator.remove();
}
}
System.err.println("退出登陆,在线人数:" + userSessions.size());
}
session.invalidate();
}
}
PageViewUtils
public class PageViewUtils {
private static class PageViewUtil {
private static final PageViewUtils INSTANCE = new PageViewUtils();
}
private PageViewUtils() {
}
public static PageViewUtils getInstance() {
return PageViewUtil.INSTANCE;
}
private synchronized ServletContext getServletContext(HttpServletRequest request) {
return request.getServletContext();
}
@SuppressWarnings("unchecked")
public synchronized void setNum(HttpServletRequest request, Integer uid) {
ServletContext application = getServletContext(request);
// 当日访问总人数
Map<Integer, Date> userNum = (Map<Integer, Date>) application.getAttribute("userNum");
if (userNum == null) {
userNum = new HashMap<>();
userNum.put(uid, new Date());
application.setAttribute("userNum", userNum);
} else {
userNum.put(uid, new Date());
}
System.err.println("总人数:" + userNum.size());
// 每小时 时间段内访问人数
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
// 当前小时
int h = calendar.get(Calendar.HOUR_OF_DAY);
Map<Integer, Set<Integer>> hourlyUserNum = (Map<Integer, Set<Integer>>) application
.getAttribute("hourlyUserNum");
if (hourlyUserNum == null) {
hourlyUserNum = new HashMap<>();
for (int i = 0; i < 24; i++) {
hourlyUserNum.put(i, new HashSet<Integer>());
}
Set<Integer> set = new HashSet<>();
set.add(uid);
hourlyUserNum.put(h, set);
application.setAttribute("hourlyUserNum", hourlyUserNum);
} else {
Set<Integer> set = hourlyUserNum.get(h);
set.add(uid);
hourlyUserNum.put(h, set);
}
System.err.println("时间段访问人数:" + hourlyUserNum.get(h).size());
}
}
UserController
@Controller
@RequestMapping({ "/luser" })
public class LUserController {
@Resource
private LUserService LS;
@RequestMapping(value = { "/login" }, method = {
org.springframework.web.bind.annotation.RequestMethod.POST }, produces = { "text/plain;charset=UTF-8" })
@ResponseBody
public String login22(Model model, HttpServletRequest request, @RequestBody Map<String, String> map,
HttpServletResponse response) {
String uphone = (String) map.get("uphone");
String pwd = (String) map.get("pwd");
T_User user = new T_User();
user.setPwd(pwd);
user.setUphone(uphone);
user = this.LS.login(user);
if (user != null) {
SessionUtils.getInstance().setSession(request, user.getUid());
return "success";
}
return "账号或密码错误";
}
@RequestMapping({ "/outlogin" })
public ResponseEntity<JSONObject> outlogin(HttpServletRequest request) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", Integer.valueOf(200));
jsonObject.put("url", "jsp/indexdeom");
try {
Cookie[] cookies = request.getCookies();
String value = null;
Cookie[] arrayOfCookie1;
int j = (arrayOfCookie1 = cookies).length;
for (int i = 0; i < j; i++) {
Cookie cookie = arrayOfCookie1[i];
if (cookie.getName().equals(Md5Utils.getMd5("shuserlogin"))) {
value = cookie.getValue();
}
}
if (value != null) {
this.stringRedisTemplate.delete(value);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
SessionUtils.getInstance().invalidateSession(request.getSession());
}
return ResponseEntity.ok(jsonObject);
}
}
/**
* 定时任务 用于数据统计
*
*/
@Component
public class TaskPageViewController implements BaseTaskController {
@Resource
LUserService lUserService;
@Resource
PageviewService pageviewService;
@Resource
NewMemberService newMemberService;
@Resource
IMService imservice;
@SuppressWarnings("unchecked")
@Override
@Scheduled(cron = "0 0 0/1 * * ? ")
public void Task() {
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
ServletContext servletContext = webApplicationContext.getServletContext();
Integer integer = 0;
Map<Integer, Set<Integer>> hourlyUserNum = (Map<Integer, Set<Integer>>) servletContext
.getAttribute("hourlyUserNum");
if (hourlyUserNum != null && !hourlyUserNum.isEmpty()) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
int i = calendar.get(Calendar.HOUR_OF_DAY);
integer = hourlyUserNum.get(i).size();
}
Integer integer2 = 0;
Map<Integer, Date> s1 = (Map<Integer, Date>) servletContext.getAttribute("userNum");
if (s1 != null && !s1.isEmpty()) {
integer2 = s1.size();
Calendar calendar = Calendar.getInstance();
int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
if (hourOfDay == 23) {
s1.clear();
}
}
System.err.println("人数统计{小时内访问人数 :" + integer + "今日访问总人数:" + integer2 + "}");
setNum(new Date(), integer, integer2);
}
public int setNum(Date date, Integer integer, Integer integer2) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int i = calendar.get(Calendar.HOUR_OF_DAY);
String tdate = new SimpleDateFormat("yyyyMMdd").format(date);
Pageview selectByPrimaryKey = pageviewService.selectByPrimaryKey(tdate);
Pageview pageview;
int r;
if (selectByPrimaryKey != null) {
pageview = selectByPrimaryKey;
Pageview set = StatisticsUtil.setPageview(pageview, i, integer);
StatisticsUtil.pageviewNotNull(set);
if (set.getTotal() < integer2) {
set.setTotal(integer2);
}
r = pageviewService.updateByPrimaryKey(set);
} else {
pageview = new Pageview();
pageview.setTdate(tdate);
Pageview pageview2 = StatisticsUtil.setPageview(pageview, i, integer);
StatisticsUtil.pageviewNotNull(pageview2);
pageview2.setTotal(integer2);
r = pageviewService.insert(pageview2);
}
return r;
}
}