手机号,验证码登录校验(指定时间内,指定IP不用重复登录);获取客户端IP;手机号正则Pattern

在“字符验证码的创建”一文中,已经介绍了如何创建验证码,这回我们使用手机号和验证码来做登录校验:
HTML页面:

<form id="form" action="/login" method="post">
    <div>
        手机号:
        <input type="text" id="phoneNumber" name="phoneNumber">
    div>
    <div>
        验证码:
        <input type="text" id="verifyCode" name="verifyCode">
        <img th:src="@{/verifyCode}" id="realVerifyCode">
        <a href="#" onclick="changeVerify()" id="changeVerify">看不清,换一张a>
    div>
    <div>
        <button type="button" onclick="submit()">登录button>
    div>
form>

JavaScript代码(使用了jquery.form.js):

function submit() {
     
    $("#form").ajaxForm(function(r) {
     alert();
        if(r && r.success) {
     
            window.location.href = "/toIndex";
        } else {
     
            alert(r.msg);
        }
    })
}

登录校验:

@Controller
public class LoginController {
     

    // 手机号正则表达式
    private Pattern phonePattern = Pattern.compile("^0?(13[0-9]|14[5-9]|15[012356789]|166|17[0-8]|18[0-9]|19[89])" +
            "[0-9]{8}$");
    // 有效手机号
    private String[] phones = {
     "15000000000", "15111111111", "15222222222"};
    // 登录信息列表
    public static List<LoginMessage> loginMessageList = new ArrayList<>();
    
    @RequestMapping("/toLogin")
    public String toLogin() {
     
        return "login/login";
    }

    @RequestMapping("/toIndex")
    public String toIndex() {
     
        return "login/index";
    }

    @PostMapping("/login")
    @ResponseBody
    public JsonModel login(String phoneNumber,// 手机号
                              String verifyCode,// 验证码
                              HttpServletRequest request) {
     
        JsonModel js = new JsonModel();
        js.success = false;
        if (StringUtils.isEmpty(phoneNumber) || !phonePattern.matcher(phoneNumber).matches()) {
     
            js.setMsg("请输入正确的手机号");
            return js;
        }
        // 如果一周内登录过(也可以放入拦截器中校验)
        if (checkLoginedInWeek(phoneNumber, request).success) {
     
            js.success = true;
            return js;
        }
        if (!checkVerifyCode(verifyCode,request).success) {
     
            js.setMsg("请输入正确的验证码");
            return js;
        }
        // 模仿数据库查询操作
        if (!Arrays.asList(phones).contains(phoneNumber)) {
     
            js.setMsg("请输入正确的手机号");
            return js;
        }
        // 校验通过, 在Session中保存登录者信息
        HttpSession session = request.getSession();
        session.setAttribute("phone", phoneNumber);
        // 模仿将登录信息存入数据库
        LoginMessage loginMessage = new LoginMessage();
        loginMessage.setIp(getIP(request));
        loginMessage.setLoginTime(new Date());
        loginMessage.setPhoneNumber(phoneNumber);
        // 用于拦截器
        loginMessageList.add(loginMessage);

        js.success = true;
        return js;
    }

    // 获取客户端登录IP
    private String getIP(HttpServletRequest request) {
     
        String ip = request.getHeader("X-Real-IP");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
     
            ip = request.getHeader("X-Forwarded-For");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
     
            ip = request.getRemoteAddr();
        }
        if (ip != null && ip.length() != 0) {
     
            ip = ip.split(",")[0];
        }
        return ip;
    }

    // 验证码校验
    private JsonModel checkVerifyCode(String verifyCode, HttpServletRequest request) {
     
        JsonModel js = new JsonModel();
        js.success = false;
        if (StringUtils.isEmpty(verifyCode)) {
     
            return js;
        }
        HttpSession session = request.getSession();
        String realVerifyCode = (String) session.getAttribute("verifyCode");
        if (StringUtils.isNotEmpty(realVerifyCode) && realVerifyCode.equals(verifyCode)) {
     
            js.success = true;
        }
        return js;
    }
	// 校验是否曾经在一周内登录过
    private JsonModel checkLoginedInWeek(String phoneNumber, HttpServletRequest request) {
     
        JsonModel js = new JsonModel();
        js.setSuccess(false);
        String ip = getIP(request);
        for (LoginMessage item : loginMessageList) {
     
            // 若包含登录信息
            if (item.getPhoneNumber().equals(phoneNumber) && item.getIp().equals(ip)) {
     
                Date now = new Date();
                Date pre = item.getLoginTime();
                // 一周内登录过
                if (now.getTime()-pre.getTime()< 7*24*60*60*1000) {
     
                    // 更新session
                    request.getSession().setAttribute("phone", phoneNumber);
                    // 更新保留的登录信息
                    item.setLoginTime(now);
                    js.setSuccess(true);
                    return js;
                }
            }
        }
        return js;
    }

}

// 登录信息
class LoginMessage {
     
    private String phoneNumber;
    private String ip;
    private Date loginTime;
	... ...
}

你可能感兴趣的:(模板代码)