如何控制只让一个用户登录?

aton 2004-03-16 09:15:07
在JSP/Servlet/JavaBean环境下,如何控制只让一个用户登录?当系统有用户登录了,别的用户就不能再登录?
...全文
120 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
JetGeng 2004-03-17
  • 打赏
  • 举报
回复
把一个变量设成application范围的,对这个变量进行P V操作,就好了
steven_cheng 2004-03-17
  • 打赏
  • 举报
回复
说说我的做法.
把用户和session对象一一对应,置入一个Map中,每次登录的时候检查当前用户是否已经在这个Map中,如果有,并且session不相等(==),就把前一个session置为无效;如果当前用户不在Map中,置入。用户退出,从Map中remove,并且置session无效;session自动过期,从Map中remove。
需要注意的是,这些操作必须同步。
kingmaxno1 2004-03-17
  • 打赏
  • 举报
回复
同意guxing415(孤星)的说法,也可以不建表,用application来代替,
session事件监听的写法为:
public class SessionTest implements javax.servlet.http.HttpSessionBindingListener
{
//加入session对象时触发此方法
public void valueBound(HttpSessionBindingEvent event)
{
}
//移出session时触发此方法
public void valueUnbound(HttpSessionBindingEvent event)
{
}
}
剑事 2004-03-17
  • 打赏
  • 举报
回复
package com;

import javax.servlet.http.*;
import javax.servlet.*;
import java.util.Date;
import java.sql.*;
import java.net.URL;
import java.text.*;
import java.util.Vector;
import java.net.Socket.*;


public class listen implements HttpSessionBindingListener {
public listen(){
}


private Vector users=new Vector();
public int getCount(){
users.trimToSize();
return users.capacity();
}
public boolean existUser(String userName){
users.trimToSize();
boolean existUser=false;
for (int i=0;i<users.capacity();i++ )
{
if (userName.equals((String)users.get(i)))
{
existUser=true;
break;
}
}
return existUser;
}

public boolean deleteUser(String userName) {
users.trimToSize();
if(existUser(userName)){
int currUserIndex=-1;
for(int i=0; i<users.capacity();i++){
if(userName.equals((String)users.get(i))){
currUserIndex=i;
break;
}
}
if (currUserIndex!=-1){
users.remove(currUserIndex);
users.trimToSize();
return true;
}
}
return false;
}

public Vector getOnLineUser()
{
return users;
}
public void valueBound(HttpSessionBindingEvent e) {
users.trimToSize();
HttpSession session = e.getSession();
session.getAttribute("teleno");



if(!existUser(e.getName())){
users.add(e.getName());
try
{
java.util.Date dt = new java.util.Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String logintime=sdf.format(dt);
String url = "jdbc:bea:sqlserver://192.168.20.25:1433;DatabaseName=Community";

Class.forName("weblogic.jdbc.sqlserver.SQLServerDriver");
Connection con = DriverManager.getConnection(url,"sa","jfy");
PreparedStatement stmt = con.prepareStatement("insert into UserLoginInfo(Telephone,LoginTime,SessionID,UserIP) values('"+e.getName()+"','"+logintime+"','"+session.getId()+"','"+session.getAttribute("ip")+"')");

stmt.executeUpdate();



stmt.close();
con.close();
}catch(java.lang.Exception ex){
ex.printStackTrace();
}
System.out.print(session.getAttribute("ip")+"\t 登入到系统\t"+(new Date()));
System.out.println(" 在线用户数为:"+getCount());
}else
System.out.println(e.getName()+"已经存在");
}

public void valueUnbound(HttpSessionBindingEvent e) {
users.trimToSize();
String userName=e.getName();
deleteUser(userName);
HttpSession session = e.getSession();
try
{
java.util.Date dt = new java.util.Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String logouttime=sdf.format(dt);
String url = "jdbc:bea:sqlserver://192.168.20.25:1433;DatabaseName=Community";

Class.forName("weblogic.jdbc.sqlserver.SQLServerDriver");
Connection con = DriverManager.getConnection(url,"sa","jfy");
PreparedStatement stmt = con.prepareStatement("update UserLoginInfo set LogoutTime='"+logouttime+"' where SessionID='"+session.getId()+"'");

stmt.executeUpdate();



stmt.close();
con.close();
}catch(java.lang.Exception ex){
ex.printStackTrace();
}
System.out.print(userName+"\t 退出系统\t"+(new Date()));
System.out.println(" 在线用户数为:"+getCount());
}
}
guxing415 2004-03-17
  • 打赏
  • 举报
回复
当用户登陆时,给他加上session,写入数据库的某表中,其他人再用这个帐号登陆时先查看此表,已经有人登陆了,就不允许他再登陆了.当用户登出的时候删除掉相应记录.当然要为这个session加上session监听器.


这个方法不错吗!
liutang2 2004-03-16
  • 打赏
  • 举报
回复
就是用session要简单一点,
jinsfree 2004-03-16
  • 打赏
  • 举报
回复
楼上考虑的比较周全
Leemaasn 2004-03-16
  • 打赏
  • 举报
回复
還是用變量比較好,
不要寫文件或數據庫,

用戶非法退出怎麽辦。。。
little06 2004-03-16
  • 打赏
  • 举报
回复
同意一楼的说法
timtin0361 2004-03-16
  • 打赏
  • 举报
回复
呵呵 application里面保存个值就行了 绝对可以
凋零的老树 2004-03-16
  • 打赏
  • 举报
回复
控制一个session不为空以后就无法登陆不就行了吗?
zl_xue 2004-03-16
  • 打赏
  • 举报
回复
or In DB set a flag
Weilibo 2004-03-16
  • 打赏
  • 举报
回复
设置变量比较可行

但是有没有比这更好一点的,依靠语言本身的功能实现的呢?
up
gln 2004-03-16
  • 打赏
  • 举报
回复
当用户登陆时,给他加上session,写入数据库的某表中,其他人再用这个帐号登陆时先查看此表,已经有人登陆了,就不允许他再登陆了.当用户登出的时候删除掉相应记录.当然要为这个session加上session监听器.
wandou999 2004-03-16
  • 打赏
  • 举报
回复
当一个用户登陆后,把按钮变成灰色(不可用)即可
fantasyCoder 2004-03-16
  • 打赏
  • 举报
回复
呵呵!!!
楼上的方法可行!!!
xylohouse 2004-03-16
  • 打赏
  • 举报
回复
把一个变量设成application范围的,
如果有用户则取出此变量值比较
dengyin2000 2004-03-16
  • 打赏
  • 举报
回复
要考虑到 用户非法退出哟
如 死机 停电
VVV_lucky 2004-03-16
  • 打赏
  • 举报
回复
觉得application还是可以的。
shaopin 2004-03-16
  • 打赏
  • 举报
回复
单独用application或session好象是不太可行的,
用pagecontext与session的bound或unbound监听,
具体查找一下资料

81,122

社区成员

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

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