jsp怎样解决一个用户异地同时登陆
新手~ 请各位大虾能说清楚一点 谢谢鸟
[解决办法]
太想当然了,结束进程呢?断电呢?这个没法控制的。我发过关于这个的帖子,没有满意的答案。
[解决办法]
写个 在线用户列表,
每次登陆之前 去查询这个列表
[解决办法]
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里面取(塞)值啊,啥加字段的方式啊,等等。
[解决办法]
是的,用侦听器监视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();
}
}
[解决办法]
你就记住断电了,你非正常退出,监听照样能监听的倒,自己去试试吧
[解决办法]
其实36楼的方法是非常可行的。而且个人感觉是所有方法之中最好的。可以在浏览器加个cookie应该就应该可以解决吧