2011-11-01 12:34:55
防止重复登陆的思路就是:判断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配置部分如下:
- <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>
本文出自 “幽灵柯南的技术blog” 博客,请务必保留此出处http://enetq.blog.51cto.com/479739/702256