[java]Struts2防止用户重新登陆的实现

来源:互联网 发布:腾讯何时优化吃鸡 编辑:程序博客网 时间:2024/04/30 19:34

  防止重复登陆的思路就是:判断session中用户的值(比如;用户名、用户id等)是否存在,如果存在,则提示用户此账户已登陆,类似QQ的重复登陆功能。

  实现如下:(此类已经在项目中运行,代码拷贝至实际的项目,稍微修改即可)

  ①SessionListener,该listener实现 HttpSessionListener接口

  import javax.servlet.http.*; import java.util.*; public class SessionListener implements HttpSessionListener{ @SuppressWarnings("unchecked") private static java.util.Hashtable hUserName = new Hashtable(); public void sessionCreated(HttpSessionEvent se){ System.out.println( "客户端已连接服务器 --会话号为: " + se); } public void sessionDestroyed(HttpSessionEvent se){ hUserName.remove(se.getSession()); System.out.println( "用户会话已失效session -- " + se); } @SuppressWarnings("unchecked") public synchronized static boolean isLogined(HttpSession session,String user_id1,String user_name){//(踢掉先登陆者再抢)是否该帐户已经在使用Action调用 boolean flag = false; if(hUserName.containsKey(user_id1)){ flag = true; HttpSession vsession = (HttpSession)hUserName.get(user_id1); try { vsession.invalidate();//踢掉先登陆者 System.out.println("用户 - " + user_name + " || 已存在 - " +session); System.out.println("用户 - " + user_name + " || 被挤掉了"); } catch (Exception ex){} } else{ flag = false; } hUserName.remove(user_id1); hUserName.remove(user_name); if(flag==false){//如果没有登陆则在哈西表中记录 hUserName.put(user_id1,session); System.out.println("用户已经登陆: - " + user_name + " || 会话号为: - " +session); } return flag; } }

  ②登陆Action调用如下:

  public String userLogin() { String username = ""; String realname = ""; try { listAllUser = userService.userLogin(user.getUsername(), Password .createPassword(getPassword())); } catch (Exception e) { e.printStackTrace(); } Iterator<OrderUser> rs = listAllUser.iterator(); HttpSession session = ServletActionContext.getRequest().getSession(); if (listAllUser.size() != 0) { while (rs.hasNext()) { OrderUser user = rs.next(); session.setAttribute("username", user.getUsername().toString() .trim()); session.setAttribute("realname", user.getName().toString() .trim()); session.setAttribute("id", user.getId().toString().trim()); Timestamp d = new Timestamp(System.currentTimeMillis()); user.setLoginTime(d); userService.update(user); System.out.println("MD5验证4" + Password.authenticatePassword(user.getPassword(), getPassword())); username = user.getUsername().toString().trim(); realname = user.getName().toString().trim(); // 判断是否冻结账户 if (user.getStatus().equals("冻结")) { return "dongjie"; } // }else{ // return SUCCESS; // } } boolean flag = SessionListener.isLogined(session, username, realname); if (flag == true) { return "isloged"; } else { System.out.println("用户正常登陆"); } return SUCCESS; } else { return INPUT; } }

  ③web.xml配置部分如下:

  <listener> <listener-class>com.yaxing.util.SessionListener</listener-class> </listener>

  ④struts.xml配置部分如下:http://jiaxingbailing.com sducc1122

  <action name="userLogin" class="userBean" method="userLogin"> <result name="success">/web/Index.html</result> <result name="input">/web/loginFailure.jsp</result> <result name="dongjie">/web/dongjie.jsp</result> <result name="isloged">/web/loged.jsp</result> </action>

  ⑤提示js 如下:

  <body> <script type="text/javascript"> alert("你的账号已经登录!"); </script> <% response.setHeader("refresh","0;URL = ../web/Index.html"); %> </body>

原创粉丝点击