新手请教java web一个帐号只能一个用户使用的问题

yangjianyao1990 2012-08-20 07:46:45
最近写一个小项目,要实现一个帐号一个人使用。后登陆的挤掉前面登陆的。新手不太懂,希望有人可以教教我。下面是登陆代码,听说只要在下面代码中加个判断就行了,可是我不太懂。新手分比较少



import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import com.icss.helper.BatchSql;
import com.icss.service.BaseService;

/**
* 登陆相关功能
* @author shixiaolong
* Jun 7, 2012
*/
public class LoginService extends BaseService{

/**
* @param request
* @return
*/
public int login(HttpServletRequest request){
String username = req.getValue(request, "username");
String password = req.getValue(request, "password");
String irand = req.getValue(request, "irand");//验证码
//首先判断账户是否存在
String sql="select count(1) from tbl_user where nickname=? and userstate=1 ";
int result = db.queryForInt(sql,new Object[]{username});
if(result!=1){
//用户不存在
return -1;
}
sql="select count(1) from tbl_user where nickname=? and password=fn_md5(?) and userstate=1 ";
result = db.queryForInt(sql,new Object[]{username,password});
if(result!=1){
//密码不正确
String pwwrong_flag = (String)request.getSession().getAttribute("pwwrong_flag");
if(pwwrong_flag==null||"".equals(pwwrong_flag)){
request.setAttribute("username", username);
this.recordLoginHisFail(username, request);
return -2;}
}
String rand = (String)request.getSession().getAttribute("rand");
if(!irand.equals(rand)){
request.setAttribute("username", username);
request.setAttribute("password", password);
this.recordLoginHisFail(username, request);
//验证码错误
return -3;
}
//设置session 时间 单位:秒
request.getSession().setMaxInactiveInterval(1800);
log.debug("该“"+req.getValue(request, "username")+"”用户登陆,会话有效时间为半个小时!");
//把用户信息放入session 中
sql="select * from tbl_user where nickname=? ";
Map user = db.queryForMap(sql,new Object[]{username});
request.getSession().setAttribute("user",user);
this.recordLoginHisSuccess(username, request);
///
String sql1="select count(*) from tbl_login_his where user_id=?";
result = db.queryForInt(sql1,new Object[]{username});
if(result==1){
return -4;
}
else{
return 1;}
}

/**
* 登陆流水成功
*/
public void recordLoginHisSuccess(String username,HttpServletRequest request){
String ipaddress = this.getIpAddr(request);
String sql="insert into tbl_login_his(user_id,login_date,is_success,ip_address) values(?,sysdate,1,?)";
int result = db.update(sql,new Object[]{username,ipaddress});
//如果登陆不成功,保存日志
if(result!=1){
log.error("----登陆流水入库失败---");
}
}

/**
* 登陆流水失败
*/
public void recordLoginHisFail(String username,HttpServletRequest request){
String ipaddress = this.getIpAddr(request);
String sql="insert into tbl_login_his(user_id,login_date,is_success,ip_address) values(?,sysdate,0,?)";
int result = db.update(sql,new Object[]{username,ipaddress});
//如果登陆不成功,保存日志
if(result!=1){
log.error("----登陆流水入库失败---");
}
}

/**
* 获取客户端的真实地址
* @param request
* @return
*/
public String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}

/**
* 退出登陆
* @return
*/
public String loginOff(HttpServletRequest request){
HttpSession session = request.getSession();
session.removeAttribute("user");
session.invalidate();


return "error";
}

public String loginOffbank(HttpServletRequest request){
HttpSession session = request.getSession();
session.removeAttribute("bank");
session.invalidate();


return "error";
}

/**
* 密码修改
* @return
*/
public int changePassword(HttpServletRequest request){
String new_password_1 = req.getValue(request, "new_password_1");
String new_password_2 = req.getValue(request, "new_password_2");
String current_password = req.getValue(request, "current_password");
String currentpassword = db.queryForString("select fn_md5(?) from dual",new Object[]{current_password});
Map user = (Map)request.getSession().getAttribute("user");
String userid = str.get(user, "USERID");
String old_password = str.get(user, "PASSWORD");
if(!currentpassword.equals(old_password)){
return -1;
}
if(!new_password_1.equals(new_password_2)){
request.setAttribute("current_password", current_password);
return -2;
}else{

String new_password = db.queryForString("select fn_md5(?) from dual",new Object[]{new_password_1});
BatchSql batchSql = new BatchSql();
String sql="update tbl_user set password = ? where userid = ? and userstate = 1 ";
batchSql.addBatch(sql,new Object[]{new_password,userid});
sql="insert into tbl_password_mod_log(userid,modify_date,old_password,new_password) " +
" values(?,sysdate,?,?)";
batchSql.addBatch(sql,new Object[]{userid,old_password,new_password});
int result = db.doInTransaction(batchSql);
if(result!=1){
log.debug("-------密码修改保存失败----------");
return -3;
}else{
sql="select * from tbl_user where userid=? ";
user = db.queryForMap(sql,new Object[]{userid});
request.getSession().setAttribute("user",user);
return 1;
}
}

}

}
...全文
215 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
s478853630 2012-08-21
  • 打赏
  • 举报
回复
补充一点:
单点登录和用户的IP没有关系,lz不需要整的这么复杂,
只要好好使用session和application,这些问题都是小kiss!!
s478853630 2012-08-21
  • 打赏
  • 举报
回复
单点登录,和数据库没有关系,和struts也没有一毛钱的关系,只需要session和application就够了,
程序逻辑如下所示:
用户登录时,你这样写:

Java code:
User user = dao.login(userName, password);// 数据库中判断用户名和密码
if (null != user) {// 表示用户存在
session.setAttribute("user", user);// 把用户放进session中
application.setAttribute(userName, session.getId());/* 把用户所在的sessionId放进application中,首先要明白一点,一个session对应一个浏览器,其次要注意一点,userName必须是唯一的*/
}



当用户访问到其他url的时候,你可以在过滤器或你的拦截器中这样写:

Java code:
User user = (User) session.getAttribute("user");// 从session中取出用户
if (null == user) {// 未登录或者登录已经过期
response.sendRedirect(request.getContextPath());// 跳转到首页或登录页面
}
String sessionId = (String) application.getAttribute(user.getUserName);
if (null == sessionId || !sessionId.equals(session.getId())) {/*这说明用户已经在其他电脑或其它浏览器登录了,那么之前登录的session就无效了,自动被后面的登录给踢掉*/
response.sendRedirect(request.getContextPath());// 跳转到首页或登录页面
}
chain.doFilter(request, response);// 通过验证,放行用户进入目标url
huimiezu 2012-08-21
  • 打赏
  • 举报
回复
spring security
lljj999 2012-08-20
  • 打赏
  • 举报
回复
不过有一个弊端,你需要写一个监听器来自动登出。
lljj999 2012-08-20
  • 打赏
  • 举报
回复
用数据库做session,在user表加两个字段叫loginstatus和loginIP,只要为loginstatus为1且loginIP和本机IP敏合的时候才可以做操作,否则过滤器甩掉。,你也可以做个判断,告诉用户你的账号在另外一个IP登陆中。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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