首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

jsp怎么解决一个用户异地同时登陆

2013-04-09 
jsp怎样解决一个用户异地同时登陆新手~请各位大虾能说清楚一点谢谢鸟[解决办法]引用:加个字段,登录为1,不

jsp怎样解决一个用户异地同时登陆
新手~   请各位大虾能说清楚一点    谢谢鸟
[解决办法]

引用:
加个字段,登录为1,不登录为0

太想当然了,结束进程呢?断电呢?这个没法控制的。我发过关于这个的帖子,没有满意的答案。
[解决办法]
写个 在线用户列表,

每次登陆之前 去查询这个列表
[解决办法]
package com.huina.sysframework.listener;


import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

import com.heating.application.agent.common.Constants;
import com.heating.application.agent.common.DateUtils;
import com.heating.application.agent.common.ExceptionStackInfo;
import com.heating.application.agent.common.IpAddress;
import com.heating.application.agent.common.MyLogger;
import com.heating.application.agent.common.ServiceManager;
import com.heating.application.agent.dto.extend.pub.SessionInfo;
import com.heating.application.agent.dto.extend.user.GeneralUserDto;

/**
 * 单点登陆
 * @author Administrator
 */
public class OnLineSessionListener implements HttpSessionAttributeListener {
private Map<String, Object> userMap = new HashMap<String, Object>();

@Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
HttpSession session = arg0.getSession();
//获取用户信息
GeneralUserDto userDto = ((SessionInfo) session.getAttribute("sessionInfo")).getGeneralUserDto();
//用SESSION的唯一ID做KEY。将用户放入
userMap.put(session.getId(), userDto);
// 把用户表是否登陆字段改为1
userDto.setIsLogin(Constants.USER_ISLOGIN_LOGIN);
try {
ServiceManager.user.getUserManagerService().updateGeneralUserDto(
userDto);
} catch (Throwable e) {
MyLogger.getLoggerByName("errorLogger").error(ExceptionStackInfo.getExceptionInfo(e));
}
// 写登陆日志
setUserLoginLogger(userDto);
System.out.println(userDto.getUserName() + "进入系统");
System.out.println("___________________________________");
}

@Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
HttpSession session = arg0.getSession();
// 获取SESSION的ID
String key = session.getId();
// 获取移除的用户
GeneralUserDto userDto = (GeneralUserDto) userMap.get(key);
try {
userDto = ServiceManager.user.getUserManagerService().
loadGeneralUserDto(userDto.getUserId());
// 把用户表是否登陆字段改为0
userDto.setIsLogin(Constants.USER_ISLOGIN_NOLOGIN);
ServiceManager.user.getUserManagerService().updateGeneralUserDto(
userDto);
} catch (Throwable e) {
MyLogger.getLoggerByName("errorLogger").error(ExceptionStackInfo.getExceptionInfo(e));
}
// 写离开日志
setUserLogoutLogger(userDto);
System.out.println(userDto.getUserName() + "离开系统");
}

@Override
public void attributeReplaced(HttpSessionBindingEvent se) {

}

// 登陆日志
private void setUserLoginLogger(GeneralUserDto userDto){


MyLogger.getLoggerByName("loginLogger").info(
userDto.getUserName() + "在"
+ DateUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss")
+ "登陆系统,Ip地址为:" + IpAddress.getIpAddr());
}

// 离开日志
private void setUserLogoutLogger(GeneralUserDto userDto){
MyLogger.getLoggerByName("loginLogger").info(
userDto.getUserName() + "在"
+ DateUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss")
+ "离开系统");
}
}

[解决办法]
登录一个用户 在application里面  标记一下,下次登录去application查找,有的话禁止登录。不知道行不行,至少不适合大访问量的网站
[解决办法]
知道已经登陆还不容易么,登陆时怎么着也要调用下登陆方法吧,登陆时往静态hashmap里面取(塞)值啊,啥加字段的方式啊,等等。
[解决办法]

引用:
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class OnLineSessionListener implements HttpSessionAttributeListener {

是的,用侦听器监视session就可以了。我以前就是这么做的,效果还不错,禁止重复登录和新登录废除老登录两种方式让用户可选。代码就不贴了。
[解决办法]
贡献代码:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;


public class User implements HttpSessionBindingListener{

//保存经过验证的用户
private static java.util.Vector allUsers = new java.util.Vector();
private static java.util.HashMap hmUsers = new java.util.HashMap();

private java.util.Hashtable htTempUserArea=new java.util.Hashtable();

private String id="";

private String name="";


public static java.util.Vector getAllUsers(){
return allUsers;
}

/**
 * @return 返回 id。
 */
public String getId() {
return id;
}

/**
 * @param id 设置 id。
 */
public void setId(String id) {
this.id = id;
}

/**
 * @return 返回 name。
 */
public String getName() {
return name;
}


/* (non-Javadoc)
 * @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)
 */
public void valueBound(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub

}

/* (non-Javadoc)
 * @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)
 */
public void valueUnbound(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
if(allUsers.contains(event.getSession())){
allUsers.remove(event.getSession());
}
if(hmUsers.containsValue(event.getSession())){
hmUsers.values().remove(event.getSession());
}

}
/**
 * 保存到session
 * @param request
 * @throws Exception
 */
public void saveToSession(HttpServletRequest request) throws Exception


{
if(hmUsers.containsKey(this.getId())){//用户已存在,强行注销
HttpSession tmpsession = (HttpSession)hmUsers.get(this.getId());

hmUsers.remove(this.getId());
if(allUsers.contains(tmpsession)){
allUsers.remove(tmpsession);
}
try{
tmpsession.invalidate();//session强行失效
}catch(Exception e){
e.printStackTrace();
}
}

HttpSession session = request.getSession(false);
session.setAttribute("UserInfo_Object", this);
    
allUsers.add(session);
    hmUsers.put(this.getId(), session);
}

public void logout(HttpServletRequest request) throws Exception
{
try{
request.getSession(false).invalidate();
System.out.println("有人正常退出!");
}catch(Exception e){
}
}

/**
     * 从当前request获得当前用户的UserInfo
     * */
    public static User getInstance(HttpServletRequest request)
        throws Exception
    {
        HttpSession session = request.getSession(false);
        if(session == null)
        {
            throw new Exception("会话已无效,请重新登录!");
        }
        Object o = session.getAttribute("UserInfo_Object");
        User user = (User)o;
        if(user == null)
        {
            throw new Exception("登录信息失效,请重新登录!");
        } else
        {
            return user;
        }
    }
    
    public void setTempUserValue(String sKey, Object o)
    {
        htTempUserArea.put(sKey, o);
    }
    
    public Object getTempUserValue(String sKey)
    {
        return htTempUserArea.get(sKey);
    }
    public void removeTempUserValue(String key)
    {
        Object obj = htTempUserArea.get(key);
        htTempUserArea.remove(key);
        obj = null;
    }

    public void removeTempUserValueAll()
    {
        htTempUserArea.clear();
    }
}

[解决办法]

引用:
引用:
知道已经登陆还不容易么,登陆时怎么着也要调用下登陆方法吧,登陆时往静态hashmap里面取(塞)值啊,啥加字段的方式啊,等等。

如果用户非正常退出还算登录么?断电、断网、结束进程,这些都是没有办法控制的。知道登录太难了。



你就记住断电了,你非正常退出,监听照样能监听的倒,自己去试试吧 
[解决办法]
引用:
引用:
有答案的:

思路是:
写个类实现接口HttpSessionBindingListener,在这个类里面放个static的HashMap,登录时,将用户的session放进去, key为用户名,value为session对象,而HttpSessionBindingListener有个方法叫作valueUnbound,session失效时会执行这个方……

其实36楼的方法是非常可行的。而且个人感觉是所有方法之中最好的。可以在浏览器加个cookie应该就应该可以解决吧

热点排行