假设 有2个人用同一个帐号 ,不能同时登录 只能有一个人登录 ,求解决方法?
解决方案 »
- MyEclipse SVN 报错
- 求助:直接通过端口号访问应用程序
- 求助:希望给个网站的源码
- ibatis使用时查看oracle数据库中v$process里session过多的问题
- Struts2配置文件include的问题
- 初涉struts facade模式
- description The server encountered an internal error () that prevented it from fulfilling this request
- 用hibernate的时候 用哪个检索方式比较多?
- 为什么我的JAVA程序无法连接DB2数据库
- jsp中用jdbc查询oracle数据库返回中文乱码,还有救吗?
- 这问题不知道怎么描述!大家来看看咯!很简单的!!
- JAVA代码的疑问?
有的话 T掉前一个用户
要做到很友好的 还是不容易的 看你的需求了
一直没做过。
http://www.hao023.com/uploads/dandiandenglu.pdf
直接用 sessioncotroller 限制用户登录个数为1,
并且设置其为 替换登录为true,就可以实现。
楼主给分.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
HttpSession session = request.getSession();
ServletContext application = session.getServletContext();
String msg = "";
boolean isLogin = false;
Connection conn = ConnectionManager.getConnection();
String sql = "select * from t_loginuser where username = ? and password = ?";
PreparedStatement stmt;
try {
stmt = conn.prepareStatement(sql);
stmt.setString(1,username);
stmt.setString(2,password);
ResultSet rs = stmt.executeQuery();
if(rs.next()){
User user = new User();
user.setUsername(rs.getString("USERNAME"));
Map users = (Map)application.getAttribute("LOGINUSERMAP");
if(users == null){
users = new HashMap<String, User>();
application.setAttribute("LOGINUSERMAP", users);
users.put(user.getUsername(), user);
session.setAttribute("LOGINUSER", user);
users.put(user.getUsername(), user);
msg = "欢迎您,"+user.getUsername();
request.setAttribute("msg", msg);
request.getRequestDispatcher("/welcome.jsp").forward(request, response);
}else{
Set<String> usernames = users.keySet();
for (String un : usernames) {
if (un.equals(user.getUsername())) {
msg = "用户已经登录";
isLogin = true;
break;
}
}
if (isLogin) {
request.setAttribute("msg", msg);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}else {
session.setAttribute("LOGINUSER", user);
users.put(user.getUsername(), user);
msg = "欢迎您,"+user.getUsername();
request.setAttribute("msg", msg);
request.getRequestDispatcher("/welcome.jsp").forward(request, response);
}
}
}else {
msg = "用户名或密码错误";
request.setAttribute("msg", msg);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在web.xml文件中配置一个HttpSessionListener监听器和一个过滤器,登陆时使用一个过滤器首先来根据请求登陆信息参数查找数据库记录,并查看相应记录的登陆字段状态:
1、如果登陆字段状态为已登陆,则该过滤器返回用户已经登陆的提示相应信息。
2、如果登陆字段状态为未登陆,则该过滤器继续处理请求,使请求request对象生成一个新的session保存用户信息后同时由HttpSessionListener监听器的sessionCreated(HttpSessionEvent event)方法更改数据库中登陆字段的标记状态为“登陆”,返回请求,使该过滤器转由其他组件处理。
3、当该session超时时,由HttpSessionListener监听器的sessionDestroyed(HttpSessionEvent event)方法再将该登陆字段状态改回未登陆的标记值“未登陆”。
原因如下:如果做了限制,则会发生问题。如果第一个人登录后,一不小心关闭浏览器,然后他/她自认倒霉,重新登录,服务器记录已经有人登录了(浏览器session id 不同),那他/她只能傻等服务器端"session timeout",不是很耽误事情么?
如果加上 IP 地址判断,那也不行。通过代理服务器上网的两个用户,你服务器端只能获取到代理服务器ip,无法判断。从业务逻辑上也不需要做限制:
1. 如果两个人都有用户名和密码,说明他们都可能是合法用户。
2. 如果两个人中有一个人是坏人,那么你无法知道哪个人是坏人。有可能第一个是坏人,正常登录,你系统放进去;第二个人是好人,正常登录,你把他拦住,他想工作都做不了,也耽误事情。
在线用户名 登陆IP 登陆时间 下线时间 用户ID sessionID
用户每次登陆就往用户表中增加一条记录 下线时间不增加
判断一个用户是否在线
select count(*) from OnlineUser where 下线时间 is null and 用户ID=?
如果在线就把他T掉
update OnlineUser set 下线时间 =getdate() where 下线时间 is null and userId=?
再让后一个用户登陆,然后通知前一个用户他下线,并且把地址指向登陆界面。
如果不会 单独联系 QQ275080310 我有权限控制的单独项目。
A,B 两人,
A 登录中,B 要登录,提示 此用户已登录,是否强制登录?
强制登录:A清除,B登录,A再次提交请求后,提示请重新登录.
不强制登录:一切照常
补充下,数据库中也需要一个字段来描述是否登录中.
这样可以避免,"如果第一个人登录后,一不小心关闭浏览器,然后他/她自认倒霉,重新登录,服务器记录已经有人登录了(浏览器session id 不同),那他/她只能傻等服务器端"session timeout",不是很耽误事情么?
"
现在在给中国银行做个东西,也用的这个模式.
“后者踢前者”不礼貌。再说别人如果写了半个小时文章,你突然把他踢掉,他不骂娘才怪。
“是否登录中”在 web 系统中无法实现,用户“一不小心关闭浏览器”时 web 服务器并不知道。这不同于C/S网络的程序。