前几天,网上找了些朋友的资料,做了一个小功能,验证用户是否重复登录。

原理就是:每一个用户,登录前有一个验证,当第一次登录时,会把其session信息,添加到一个特定的静态变量中。当第二次登录时,验证到静态变量中存在该用户的信息,就表示为重复登录。

jsp代码,一个form表单提交:

method="post">

用户名:

密  码:

struts2配置:

/relogin.jsp

/ok.jsp

action代码:

/*

* 可判断用户是否重复登录

*/

public String reLogin() {

String userId = this.getTxtUser();//ServletActionContext.getRequest().getParameter("txtUser");

UserInfo user = new UserInfo();

user.setUserId(userId);

//验证该用户ID,是否已经登录。当前用户比较已登录到系统的静态变量中的值,是否存在。

Boolean hasLogin = SessionUserListener.checkIfHasLogin(user);

// 如果重复登录,控制端则打印信息,返回登录页面

if (hasLogin) {

System.out.println(user.getUserId()+"已经登录到本系统。");

return "input";

// SessionUserListener.removeUserSession(userId);

} else {

// 如果没有重复登录,则将该登录的用户信息添加入session中

ServletActionContext.getRequest().getSession().setAttribute("userInfo", user);

// 比较保存所有用户session的静态变量中,是否含有当前session的键值映射,如果含有就删除

if (SessionUserListener.containsKey(ServletActionContext.getRequest().getSession().getId())) {

SessionUserListener.removeSession(ServletActionContext.getRequest().getSession().getId());

}

//把当前用户封装的session按,sessionID和session进行键值封装,添加到静态变量map中。

SessionUserListener.addUserSession(ServletActionContext.getRequest().getSession());

}

return "success";

}session监听类:

package com.zyujie.listener;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import javax.servlet.http.HttpSession;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

import com.zyujie.pojo.UserInfo;

public class SessionUserListener implements HttpSessionListener {

// key为sessionId,value为HttpSession,使用static,定义静态变量,使之程序运行时,一直存在内存中。

private static java.util.Map sessionMap = new java.util.concurrent.ConcurrentHashMap(500);

/**

* HttpSessionListener中的方法,在创建session

*/

public void sessionCreated(HttpSessionEvent event) {

// TODO Auto-generated method stub

}

/**

* HttpSessionListener中的方法,回收session时,删除sessionMap中对应的session

*/

public void sessionDestroyed(HttpSessionEvent event) {

getSessionMap().remove(event.getSession().getId());

}

/**

* 得到在线用户会话集合

*/

public static List getUserSessions() {

List list = new ArrayList();

Iterator iterator = getSessionMapKeySetIt();

while (iterator.hasNext()) {

String key = iterator.next();

HttpSession session = getSessionMap().get(key);

list.add(session);

}

return list;

}

/**

* 得到用户对应会话map,key为用户ID,value为会话ID

*/

public static Map getUserSessionMap() {

Map map = new HashMap();

Iterator iter = getSessionMapKeySetIt();

while (iter.hasNext()) {

String sessionId = iter.next();

HttpSession session = getSessionMap().get(sessionId);

UserInfo user = (UserInfo) session.getAttribute("userInfo");

if (user != null) {

map.put(user.getUserId(), sessionId);

}

}

return map;

}

/**

* 移除用户Session

*/

public synchronized static void removeUserSession(String userId) {

Map userSessionMap = getUserSessionMap();

if (userSessionMap.containsKey(userId)) {

String sessionId = userSessionMap.get(userId);

getSessionMap().get(sessionId).invalidate();

getSessionMap().remove(sessionId);

}

}

/**

* 增加用户到session集合中

*/

public static void addUserSession(HttpSession session) {

getSessionMap().put(session.getId(), session);

}

/**

* 移除一个session

*/

public static void removeSession(String sessionID) {

getSessionMap().remove(sessionID);

}

public static boolean containsKey(String key) {

return getSessionMap().containsKey(key);

}

/**

* 判断该用户是否已重复登录,使用

* 同步方法,只允许一个线程进入,才好验证是否重复登录

* @param user

* @return

*/

public synchronized static boolean checkIfHasLogin(UserInfo user) {

Iterator iter = getSessionMapKeySetIt();

while (iter.hasNext()) {

String sessionId = iter.next();

HttpSession session = getSessionMap().get(sessionId);

UserInfo sessionuser = (UserInfo) session.getAttribute("userInfo");

if (sessionuser != null) {

if (sessionuser.getUserId().equals(user.getUserId())){

return true;

}

}

}

return false;

}

/**

* 获取在线的sessionMap

*/

public static Map getSessionMap() {

return sessionMap;

}

/**

* 获取在线sessionMap中的SessionId

*/

public static Iterator getSessionMapKeySetIt() {

return getSessionMap().keySet().iterator();

}

}

java检测用户是否重复登录_Java web工程判断用户是否重复登录相关推荐

  1. java jdbc 登录_java web JDBC 判断用户登录问题!

    这是老师给我们讲课时候讲的一个实例!我没明白后来自己做练习没有按照老师的代码走!就是按我的理解敲了一遍最后敲成这样感觉越敲越晕!所以上来求教前辈们!Stringusername=request... ...

  2. java web 请求跟踪_java web 项目跟踪用户操作

    java web项目,就几个JSP页面,本人怎么跟踪用户什么时间点击了那个jsp页面,什么时候登录的,什么时候关闭jsp页面的,把跟踪用户的操作(基本上就上面这三个操作),存入数据库里面,什么时候干什 ...

  3. java连接打印机访问被拒绝_java – 尝试访问spring security中的登录页面时访问被拒绝的异常...

    我正在使用基于java的spring security.我创建了自定义访问决策选民impl. 但是当我运行应用程序时,我无法打开登录页面,因为它说,访问被拒绝. 这是在我添加自定义访问决策选民impl ...

  4. idea中创建maven依赖下的web工程(一)----用户登录界面

    如果你对idea中创建maven依赖下的web工程不是很了解,请参见上一篇博客--idea中创建maven依赖下的第一个web工程 各路大神对于idea的基本操作已经非常的熟悉了, 嗯,我还是一只入门 ...

  5. web工程中集成cas单点登录

    背景 cas的服务端已经搭建成功,现在需要在web项目中集成cas client.我们项目使用spring 1.在pom中配置 <!--cas单点登录 --><dependency& ...

  6. 服务器无线不能登录界面,Web认证无法跳转到登录页面

    步骤1.排查ePortal服务是否正常运行 1.    点击ePortal服务器桌面的程序图标 ,弹出ePortal服务管理器的控制台界面,v1.41版本服务管理器界面如下: 3.png (123.7 ...

  7. java中如何确定是数字_java中怎么判断指定的数据是字符串是否是数字?

    展开全部 java中判断字符串是否为数字的方法: 1.用JAVA自带的函数 public static boolean isNumeric(String str){for (int i = 0; i ...

  8. 微信小程序登录后再次使用判断用户是否登录

    小程序登录与否判断 小程序如果每次使用都需要用户登录势必会使用户体验感降低,如何进行判断用户是否登录了,很简单,只要调用一个API就行了 在小程序登录后的第一个page中的index.js文件的onL ...

  9. java 反正多次重复提交_java web开发时防止刷新后的重复提交

    在java web开发过程中大家经常都会遇到页面刷新后重复提交导致数据库数据重复的情况出现. 那么,如何避免重复提交数据的情况出现呢?如下代码,是在jsp中解决重复提交的一种方式. //此段代码用于防 ...

最新文章

  1. windoes server 关闭服务端口方法、漏洞补丁解决
  2. pdfbox创建pdf_PDFBox创建PDF文档
  3. 线性链条件随机场与HMM在viterbi算法中的图解对比
  4. java 8 localdatetime_java8 时间 LocalDateTime常用方法
  5. c++ vscode 第三方库_请教下,vscode中怎么编译带第三方库的文件呢?谢谢! - C++程序设计语言 - CPlusPlus - 水木社区...
  6. 解决Flash挡住层用z-index无效的问题
  7. springmvc5中设计模式
  8. 程序员的脑回路太清奇,就一件衣服跟我叨叨半天
  9. GdiPlus[40]: 不该忽略的一些基础结构
  10. ASP.NET基于donetCHARTING的自动报表
  11. 【数字信号】基于matlab GUI DTMF信号生成与检测(带按键音)【含Matlab源码 1086期】
  12. 如何放大缩小地图 和 移动拖动 地图 (一张的那种,厂区地图非世界地图)
  13. 华为2019网络挑战赛初赛网络方向部分模拟题及答案
  14. 做外链的六个有效技巧
  15. oracle crm系统叫什么,常用CRM软件有哪些?
  16. “小镇青年”、“互联网老兵”、“币圈韭菜” 玉红的众多标签为哪般?
  17. 福禄克FLUKE TIX650红外热像仪3.5英寸高像素大屏
  18. echarts 饼状图 (数据为0或很小的扇形显示问题、扇形间隔)
  19. Soul 源码分析07 SOUL Admin 网关 Http长轮询 数据同步
  20. Java实现 蓝桥杯 历届试题 波动数列

热门文章

  1. 学棋五年的我输给了昇腾CANN
  2. 图解带你掌握`JVM`运行时核心内存区
  3. 带你掌握java反序列化漏洞及其检测
  4. 图神经网络,这到底是个什么?
  5. 敏捷与安全不可兼得吗?看完这篇文章后,我想说:未必!
  6. 漫谈LiteOS之开发板-GPIO(基于GD32450i-EVAL)
  7. 爬虫新宠requests_html 带你甄别2019虚假大学 #华为云·寻找黑马程序员#
  8. 和华为云一起做件“伟大的事”,24万奖金等你来!
  9. 中科大计算机本科毕业论文范文,中国科大本科生毕业论文管理再上新台阶
  10. selenium和python的关系,Selenium+python