24小时账号连续三次登录

 本案例基于SpringMVC:完整代码下载 http://download.csdn.net/detail/geek_ymv/8226963

数据库表的结构如下:

User类

package com.geekymv.model;

import java.util.Date;

public class User {
	
	private Integer id;
	private String username;
	private String password;
	private Integer counter;
	private Date  lastLoginDate;
	
	public User() {
	}
	public User(String username, String password, Integer counter) {
		this.username = username;
		this.password = password;
		this.counter = counter;
	}
	public User(Integer id, String username, String password, Integer counter) {
		this(username, password, counter);
		this.id = id;
	}
	public User(Integer id, String username, String password, Integer counter,
			Date lastLoginDate) {
		this(id, username, password, counter);
		this.lastLoginDate = lastLoginDate;
	}
	
	//.......此处省略setter,getter方法
}
链接数据库的工具类,可以参见另外一篇博客:http://blog.csdn.net/geek_ymv/article/details/38726653

UserDAO接口:

package com.geekymv.dao;

import com.geekymv.model.User;

public interface UserDAO {

	/**
	 * 根据用户名和密码查询用户
	 * @param username
	 * @param password
	 * @return
	 */
	public User query(String username, String password);
	
	/**
	 * 根据用户名查询
	 * @param username
	 * @return
	 */
	public User queryByName(String username);
	
	/**
	 * 更新用户登录次数
	 * @param user
	 */
	public void update(User user);
}

UserDAOImpl实现类:
package com.geekymv.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.geekymv.dao.UserDAO;
import com.geekymv.model.User;
import com.geekymv.util.Convert2Object;
import com.geekymv.util.DBUtil;
import com.geekymv.util.DateUtil;

@Repository("userDAO")
public class UserDAOImpl implements UserDAO {

	private Convert2Object handler = new Convert2Object() {
		@Override
		public Object convert(ResultSet rs) {
			try {
				Integer id = rs.getInt("id");
				String username = rs.getString("name");
				String password = rs.getString("pwd");
				int counter = rs.getInt("counter");
				String lastLoginDate = rs.getString("login_time");
				
				User user = new User(id, username, password, counter, DateUtil.convert2Date(lastLoginDate));
				
				return user;
				
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
			return null;
		}
	};

	@SuppressWarnings("unchecked")
	@Override
	public User query(String username, String password) {
		
		String sql = "select id, name, pwd, counter, login_time from t_users where name=? and pwd=?";
		
		List<User> users = DBUtil.queryObject(sql , handler , username, password);
	
		if(users == null || users.size() == 0) {
			return null;
		}
		
		return users.get(0);
	}

	@SuppressWarnings("unchecked")
	@Override
	public User queryByName(String username) {
		String sql = "select id, name, pwd, counter, login_time from t_users where name=?";
		
		List<User> users = DBUtil.queryObject(sql , handler , username);
		
		if(users == null || users.size() == 0) {
			return null;
		}
		
		return users.get(0);
	}

	@Override
	public void update(User user) {
		String sql = "update t_users set name=?, pwd=?, counter=?, login_time=? where id=?";
		
		DBUtil.execute(sql, user.getUsername(), user.getPassword(),
					user.getCounter(), user.getLastLoginDate(), user.getId());
	}

}



UserService接口:

package com.geekymv.service;

import com.geekymv.model.MyEnum;
import com.geekymv.model.User;

public interface UserService {

	/**
	 * 用户登录
	 * @param username
	 * @param password
	 * @return
	 */
	public MyEnum login(String username, String password);
	
	/**
	 * 根据用户名查询
	 * @param username
	 * @return
	 */
	public User findByName(String username);
	
	/**
	 * 更新用户
	 * @param user
	 */
	public void update(User user);
}



UserServiceImpl实现类:
package com.geekymv.service.impl;

import java.util.Date;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.geekymv.dao.UserDAO;
import com.geekymv.model.MyEnum;
import com.geekymv.model.User;
import com.geekymv.service.UserService;
import com.geekymv.util.DateUtil;

@Service("userService")
public class UserServiceImpl implements UserService {
	
	@Resource
	private UserDAO userDAO;
	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}
	
	@Override
	public MyEnum login(String username, String password){
		User user = findByName(username); // 根据用户名查询用户
		if(user == null) { // 用户不存在
			System.out.println("用户名不存在,重新登录~");
			return MyEnum.LOGIN;
			
		}else { // 用户名存在
			Date lastLoginDate = user.getLastLoginDate(); // 用户上一次登录时间
			Date now = DateUtil.convert2Date(DateUtil.convert2String(new Date()));
			
			long time = now.getTime();
			if(lastLoginDate != null) {
				time = now.getTime() - lastLoginDate.getTime();
			}
			
			System.out.println("时间差 = " + time);
			
			int counter = user.getCounter();
			
			if(time < 2 * 60 * 1000) { // 2分钟以内连续登录
				if(counter == 3) {
					System.out.println("账号被冻结~~~");
					return MyEnum.WAIT;
				}else {
					User u  = userDAO.query(username, password);
					if(u != null) {
						System.out.println("登录成功~~~");
						user.setCounter(0);
						user.setLastLoginDate(now);
						update(user);

						return MyEnum.SUCCESS;
					}else {
						System.out.println("返回登录页面");
						user.setCounter(counter+1);
						user.setLastLoginDate(now);
						update(user);
						
						return MyEnum.LOGIN;
					}
				}
				
			}else {  // 不是连续登录
				User u  = userDAO.query(username, password);
				if(u != null) {
					System.out.println("登录成功~~~");
					user.setCounter(0);
					user.setLastLoginDate(now);
					update(user);

					return MyEnum.SUCCESS;
					
				}else {
					System.out.println("返回登录页面");
					user.setCounter(1);
					user.setLastLoginDate(now);
					update(user);
					
					return MyEnum.LOGIN;
				}
			}
		}
	
	}
	
	@Override
	public User findByName(String username) {
		
		return userDAO.queryByName(username);
	}


	@Override
	public void update(User user) {
		userDAO.update(user);
	}

}

MyEnum枚举:

package com.geekymv.model;

public enum MyEnum {
	LOGIN,
	SUCCESS,
	WAIT,
}


UserController控制器:

package com.geekymv.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.geekymv.model.MyEnum;
import com.geekymv.model.User;
import com.geekymv.service.UserService;

@Controller
@RequestMapping("/user")
public class UserController {
	
	@Autowired
	private UserService userService;
	public void setUserService(UserService userService) {
		this.userService = userService;
	}
	
	@RequestMapping(value="/login", method=RequestMethod.GET)
	public String login() {
		return "userlogin";
	}
	
	@RequestMapping(value="/login", method=RequestMethod.POST)
	public String login(User user, Model model) {
		
		MyEnum myEnum = userService.login(user.getUsername(), user.getPassword());
		
		if(myEnum == MyEnum.LOGIN) {
			return "redirect:/user/login";
		}
		
		if(myEnum == MyEnum.SUCCESS){
			return "success";
		} 
		
		if(myEnum == MyEnum.WAIT) {
			return "wait";
		}
		
		return null;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值