用户登陆问题:同一个用户帐号,在同一时间内只能一个人使用。在线等了。

xiaohua223 2005-02-24 05:44:51
水平有限呀,高手给个详解。
...全文
568 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
lurrix 2005-02-25
  • 打赏
  • 举报
回复
这里的讨论很热烈,不过首先得澄清,这个问题不叫单点登陆,呵呵,单点登陆指的是sso,感兴趣的朋友可以看看josso。

tly同学的回复只能说找到问题的一种解决办法,但实现的代码是有问题的:
1。多线程安全;
2。sessionCreated访法没有做任何实现的工作。
starsoulxp 2005-02-25
  • 打赏
  • 举报
回复
单点登陆,也可以根据网卡物理地址
mask85 2005-02-25
  • 打赏
  • 举报
回复
我想把Bean做成单例模式不就可以了?
dadunqingwa 2005-02-25
  • 打赏
  • 举报
回复
学习中,参照转的哪个帖子配置下吧……
guestroad 2005-02-25
  • 打赏
  • 举报
回复
up
congbailing_914 2005-02-25
  • 打赏
  • 举报
回复
楼上的haohaohaohao1 哈哈,在这又见到你了!
我也血洗一下,顶!!!!
taoxuwen 2005-02-25
  • 打赏
  • 举报
回复
学习 up
bp69 2005-02-25
  • 打赏
  • 举报
回复
用application简单
luoyefeng 2005-02-25
  • 打赏
  • 举报
回复
如果要管理费正常退出,可以用一个全局bean进行轮询,在设定的时间内如果没有获得用户的请求,就自动退出
shloshlo 2005-02-25
  • 打赏
  • 举报
回复
gz
tlg 2005-02-24
  • 打赏
  • 举报
回复
说明:这是转帖
tlg 2005-02-24
  • 打赏
  • 举报
回复
发现对于登录问题的解决都说用session监听,但是没有人写出示例代码,今天写了一个,希望对大家有所帮助.
解决同名用户登录的问题,类似QQ,即同名用户第二次登录,第一次登录的用户就掉线.
SessionListener.java监听session的类,部署于/App/WEB-INF/classes/com/test下(其中App为你的应用程序目录)
package com.test;
import javax.servlet.http.*;
import java.util.*;

public class SessionListener implements HttpSessionListener{
private static HashMap hUserName = new HashMap();//保存sessionID和username的映射
/**以下是实现HttpSessionListener中的方法**/
public void sessionCreated(HttpSessionEvent se){
}

public void sessionDestroyed(HttpSessionEvent se){
hUserName.remove( se.getSession().getId() );
}
/*
* isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法
* @param sUserName String-登录的用户名称
* @return boolean-该用户是否已经登录过的标志
*/
public static boolean isAlreadyEnter(HttpSession session,String sUserName){
boolean flag = false;
if(hUserName.containsValue(sUserName)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中)
flag = true;
//遍历原来的hUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)
Iterator iter = hUserName.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
if( ( (String)val ).equals(sUserName) ){
hUserName.remove(key);
}
}
hUserName.put( session.getId(),sUserName );//添加现在的sessionID和username
System.out.println("hUserName = " + hUserName);
}
else{//如果该用户没登录过,直接添加现在的sessionID和username
flag = false;
hUserName.put( session.getId(),sUserName );
System.out.println("hUserName = " + hUserName);
}
return flag;
}
/*
* isOnline-用于判断用户是否在线
* @param session HttpSession-登录的用户名称
* @return boolean-该用户是否在线的标志
*/
public static boolean isOnline(HttpSession session){
boolean flag = true;
if( hUserName.containsKey( session.getId() ) ){
flag = true;
}
else{
flag = false;
}
return flag;
}
}

web.xml部署于/App/WEB-INF下
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2.3.dtd">

<web-app>

<listener>
<listener-class>
com.inspirer.dbmp.SessionListener
</listener-class>
</listener>

</web-app>
应用部分
1.在你的登录验证时,调用SessionListener.isAlreadyEnter(session,"admin")
既可以判断该用户名的用户是否登录过,又可以使上次登录的用户掉线
2.其他页面调用SessionListener.isOnline(session),可以判断该用户是否在线.

写的应该比较详细了,希望对大家有所帮助.希望大家能提提修改的意见,认为可以的朋友帮忙UP一个!!
最后祝大家春节快乐,合家团圆
xiaohua223 2005-02-24
  • 打赏
  • 举报
回复
登录了的做个标志就可以了,退出了怎么去除标志。
kaymo 2005-02-24
  • 打赏
  • 举报
回复
登录了的做个标志就可以了
或写个共通方法
knight_yl 2005-02-24
  • 打赏
  • 举报
回复
jFresH_MaN的思想不错,具体的还要自己做.
开始不要这么多了
Building 2005-02-24
  • 打赏
  • 举报
回复
jFresH_MaN(The answer is ......),依照你的方法,如果用户非正常退出呢?比如直接关闭浏览器
wjr1982et 2005-02-24
  • 打赏
  • 举报
回复
楼上的高手我要修改的是 session.setAttribute("isLog",new String("0"));这里吗?
修改成:application.setAttribute("id","login");吗?
--------------------------------------------------------------------------------
session也是可以的,成功登陆,isLog为1。当其他用户也登陆这个ID时,就可以判断isLog
为1时,就不允许他登陆
xiaohua223 2005-02-24
  • 打赏
  • 举报
回复
我是笨鸟,能不能讲慢点。
wubai250 2005-02-24
  • 打赏
  • 举报
回复
jFresH_MaN(The answer is ......)的想法不错,还简单


xiaohua223 2005-02-24
  • 打赏
  • 举报
回复
我是初学:这个登陆的代码:
loginto.jsp:
<%
//获得请求的参数。
String id=request.getParameter("id");
String psw=request.getParameter("password");


//连接数据库
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
Connection con=java.sql.DriverManager.getConnection("jdbc:mysql://127.0.0.1/gold?useUnicode=true&characterEncoding=GB2312","root","123456");
Statement statement=con.createStatement();

ResultSet result=statement.executeQuery("select *from id where userId='"+id+"' and password='"+psw+"'");

session.setAttribute("isLog",new String("0"));

if(result.next())
{
session.setAttribute("isLog",new String("1"));
response.sendRedirect("denglu.jsp");
result.close();
statement.close();
con.close();
}
else
{
//session.setAttribute("isLog",new String("0"));
response.sendRedirect("error.html");//账号或密码错误,转入错误页面
result.close();
statement.close();
con.close();
}
%>

楼上的高手我要修改的是 session.setAttribute("isLog",new String("0"));这里吗?
修改成:application.setAttribute("id","login");吗?

加载更多回复(2)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧