• 登录功能(MD5加密)


           登录这个功能,是不管哪个项目都会用到的,登录做的好坏,安全性的保障将直接影响到整个系统的成败,尤其是一些安全性要求比较严格的项目

    1.首先需要对密码进行加密,这里用到的是md5加密,需要在login.html所在页面引入jQuery.md5.js

    <!DOCTYPE html>  
    <html>  
    <head>  
        <title>登录页面</title>  
        <meta http-equiv="content-Type" content="text/html" charset="utf-8">  
        <meta name="renderer" content="webkit|ie-comp|ie-stand">  
        <meta name="keywords" content="XXXXXXXXXXX"/>   
        <meta name="description" content="XXXXXXXXXXXXXXXXXXXXXX"/>  
        <link rel="stylesheet" type="text/css" href="${ctxPath}/resources/css/login.css">  
        <link rel="stylesheet" type="text/css" href="${ctxPath}/resources/css/layer.css">       
        <script type="text/javascript" src="${ctxPath}/resources/js/JavaScript.js"></script>  
        <script type="text/javascript" src="${ctxPath}/resources/js/jquery/jquery.min.js"></script>  
        <script type="text/javascript" src="${ctxPath}/resources/js/jquery/jQuery.md5.js"></script>  
        <script type="text/javascript" src="${ctxPath}/resources/js/validate.js"></script>  
        <script type="text/javascript" src="${ctxPath}/resources/js/tab.js"></script>  
        <script type="text/javascript" src="${ctxPath}/resources/js/newLoginDefault.js"></script>  
        <script type="text/javascript">  
        var returnUrl='${returnUrl!}';  
        </script>  
        <script type="text/javascript" src="${ctxPath}/resources/js/layer/layer.js"></script>  
        <script type="text/javascript" src="${ctxPath}/resources/js/popwin.js"></script>  
        <script type="text/javascript" src="${ctxPath}/resources/js/newlogin.js"></script>  
    </head>  
    <body>  
            <input type="hidden" id="loginFrame" value="loginFrame">  
            <input type="hidden" id="rootPath" value="${ctxPath}">  
            <form id="login" action="" method="post" class="mainForm mainForm1" style="display:block">  
                <!-- <img src="${ctxPath}/resources/images/guanbi.png" id="close" alt="" /> -->  
                <div class="container">  
                    <div class="number">  
                        <span>登录<span>  
                    </div>  
                    <div class="normalInput">  
                        <input type="text" class="phone" id="phone" name="phone" onBlur="CheckEmpty()" placeholder="请输入手机号/用户名/邮箱" onkeyup="value=value.replace(/s/g,'')">     
                        <input id="sign" name="sign" type="hidden"/>  
                    </div>  
                    <span class="error error1"></span>  
                    <span class="error error2"></span>  
                    <div class="normalInput">  
                        <input type="text" class="password" id="pass" name="password" maxlength="16" autocomplete="off" placeholder="请输入密码" onkeyup="value=value.replace(/s/g,'')" style="display: none;280px">  
                        <input type="password" class="password1" id="pass1" name="password1" maxlength="16" autocomplete="off" placeholder="请输入密码" onkeyup="value=value.replace(/s/g,'')" style="display: inline-block;280px">  
                        <input hidden="hidden" type="text" id="hiddenPass"/>  
                        <a id="pwdBtn" href="##" class="pwdBtnShow" isshow="true">  
                            <i class="i_icon" style="background-position: -60px -93px;"></i>  
                        </a>  
                    </div>  
                    <span class="error error3"></span>  
                    <a id="loginOnclick" href="javascript:" onclick="login(0)" class="fullBtnBlue">登录</a>  
                    <a target="_Blank" href="${ctxPath}/toRestpwds.htm" class="forget">忘记密码?</a>  
                </div>  
                <p>还没有账号? <a href="#" class="register">免费注册</a></p>  
            </form>  
        <script>  
            $("#close").click(function(){  
                $(".mainForm1").hide();  
            })  
              
            $('.register').unbind();  
            $('.register').click(function(){  
                var index = parent.layer.getFrameIndex(window.name);  
                parent.layer.open({  
                      type: 2,  
                      title: '',  
                      shadeClose: false,  
                      shade: 0.5,  
                      area: ['445px','374px'],  
                      content: '${request.contextPath}/registers.htm'  
                });               
                parent.layer.close(index);  
            });  
              
            //为keyListener方法注册按键事件  
           document.onkeydown=keyListener;  
           function keyListener(e){  
            // 当按下回车键,执行我们的代码  
            if(e.keyCode == 13){  
                document.getElementById("loginOnclick").onclick();    
            }  
           }  
        </script>  
    </body>  
    </html>

    2.再来看一下这个newlogin.js,注意对输入手机号和密码的加密(md5加密),hiddenPass和sign,从安全性来说这里是值得借鉴的,其他的代码也一并粘出来吧,方便以后学习和借鉴。

        function login(num){  
        //      $("#l_tips").attr("style","display:block");  
        //      $("#logMsg").html("密码不能为空!");  
                  
                reg1=/^.*[d]+.*$/;  
                reg2=/^.*[A-Za-z]+.*$/;  
                reg3=/^.*[_@#%&^+-/*/\]+.*$/;//验证密码  
                if($(".pwdBtnShow").attr("isshow")=="false")  
                {  
                    var Pval = $(".password").val();  
                }  
                else  
                {  
                    var Pval = $(".password1").val();  
                }  
                  
                if( Pval =="")  
                {  
                    $(".password").parent().addClass("errorC");  
                    $(".error3").html("请填写密码!");  
                    $(".error3").css("display","block");  
                    $(".error1").css("display","none");  
                    $(".error2").css("display","none");  
                    return false;  
                }  
                 
                 
                //注册具体方法  
        //      var PWD = $(".password").val().trim();  
        //      var PWD1 = $(".password1").val().trim();  
        //      if(PWD.length >= PWD1.length){  
        //          $("#hiddenPass").val($.md5(PWD));  
        //      }else{  
        //          $("#hiddenPass").val($.md5(PWD1));  
        //      }  
                $("#hiddenPass").val($.md5(Pval));  
            $("#sign").val($.md5($("#phone").val()+$("#hiddenPass").val()));  
              
            var flag='';  
            if(null!=$("#flag").val()){  
                flag="?flag="+$("#flag").val();  
            }  
            $("#loginOnclick").html("登录中...");  
            $('#loginOnclick').css('background-color','#ccc');  
            $('#loginOnclick').removeAttr('onclick');  
            if(num==0){  
                $.ajax({  
                    type : "POST",  
                    url : "ssl/logins.htm",                                                                 
                    dataType : "json",  
                    async : false,  
                    data:{    
                            "j_password" : $("#hiddenPass").val(),    
                            "j_username" : $("#phone").val(),    
                            "sign" : $("#sign").val(),  
                            "afs_scene":$("#afs_scene").val(),  
                            "afs_token":$("#afs_token").val(),  
                           },   
                    success : function(data) {  
                        var pathName=window.document.location.pathname;  
                          
                        var projectName=pathName.substring(0,pathName.substr(1).indexOf('/')+1);  
                        if(projectName!="/puhuilicai"){  
                            projectName="";  
                        }  
                        if (data.msg == 2){//成功返回  
                            if(data.isRisk=='yes'){//进行风险拦截  
                                $("iframe",window.parent.document).attr("src",projectName+"/toLogins.htm");  
                            }else{  
                                if(data.isFirstLogin=='no'){//登录送奖励 判断是否当天第一次登录  
                                    if(window.top==window.self){ //不存在父页面  
                                        window.location.href="https://www.baidu.com";  
                                     }else{  
                                        if(returnUrl!=''){//未登录情况下请求拦截页面  
                                            var index = parent.layer.getFrameIndex(window.name);  
                                            parent.location.href=returnUrl;  
                                            parent.layer.close(index);  
                                        }else{  
                                              
                                            //mxl  
                                            var aa=window.parent.location + '';  
                                            if(aa.indexOf('toRestpwd.htm') == -1   
                                                    && aa.indexOf('toRestpwds.htm') == -1  
                                                    && aa.indexOf('toRestpwd2.htm') == -1  
                                                    && aa.indexOf('toRestpw3.htm') == -1  
                                                    //&& aa.indexOf('toRestpw4.htm') == -1   
                                                    ){  
                                                //提示层  
                                                parent.location.reload();  
                                            }  
                                            else{  
                                                //parent.location.href="https://www.baidu.com";  
                                                parent.location.href="index.htm";  
                                                var index = parent.layer.getFrameIndex(window.name);  
                                                parent.layer.close(index);  
                                            }  
                                              
                                        }  
                                     }  
                                }else{//第一次登录当奖励窗口    
                                      
                                      
                                    //mxl  
                                    var aa=window.parent.location + '';  
                                    if(aa.indexOf('toRestpwd.htm') == -1   
                                            && aa.indexOf('toRestpwds.htm') == -1  
                                            && aa.indexOf('toRestpwd2.htm') == -1  
                                            && aa.indexOf('toRestpw3.htm') == -1  
                                            //&& aa.indexOf('toRestpw4.htm') == -1   
                                            ){  
                                        //提示层  
                                        var voucherName=data.voucherName.replace("%","*");  
                                        var index = parent.layer.getFrameIndex(window.name);  
                                        parent.$("#frame_top").load(projectName+"/frame_top.htm");  
                                        popWin.showWin("880","840","xxxx",projectName+"/ssl/loginSuccess.htm?integral="+data.integral+"&totalIntegral="+data.totalIntegral+"&loginDays="+data.loginDays+"&voucherName="+voucherName);   
                                        parent.layer.close(index);  
                                          
                                          
                                    }  
                                    else{  
                                          
                                        //parent.location.href="https://www.baidu.com";  
                                        parent.location.href="index.htm";  
                                        var index = parent.layer.getFrameIndex(window.name);  
                                        parent.layer.close(index);  
                                    }  
                                      
                                      
                                      
                                }  
                            }  
                        }else if(data.msg==1){  
                            if(data.isRisk=='yes'){//进行风险拦截  
                                $("iframe",window.parent.document).attr("src",projectName+"/toLogins.htm");  
                            }else{  
                                if(data.isFirstLogin=='no'){//登录送奖励 判断是否当天第一次登录  
                                    if(window.top==window.self){ //不存在父页面  
                                        window.location.href="https://www.baidu.com";  
                                     }else{  
                                        if(returnUrl!=''){//未登录情况下请求拦截页面  
                                            var index = parent.layer.getFrameIndex(window.name);  
                                            parent.location.href=returnUrl;  
                                            parent.layer.close(index);  
                                        }else{  
                                            parent.location.reload();  
                                        }  
                                     }  
                                }else{//第一次登录当奖励窗口    
                                    var voucherName=data.voucherName.replace("%","*");  
                                    var index = parent.layer.getFrameIndex(window.name);  
                                    parent.$("#frame_top").load(projectName+"/frame_top.htm");  
                                    popWin.showWin("880","840","普惠理财",projectName+"/ssl/loginSuccess.htm?integral="+data.integral+"&totalIntegral="+data.totalIntegral+"&loginDays="+data.loginDays+"&voucherName="+voucherName);   
                                    parent.layer.close(index);  
                                }  
                            }  
                        }else if(data.msg==-1){  
        //                  $("#loginPhone").text("账号不存在");  
        //                  $("#phone").val("");  
        //                  $("#pass").val("");        
                              
                            $(".phone").parent().removeClass("checkedN");  
                            $(".phone").parent().addClass("errorC");  
                            $(".error1").html("账号不存在");  
                            $(".error1").css("display","block");  
                            $(".error2").css("display","none");  
                            $(".error3").css("display","none");  
                            $("#loginOnclick").html("登录");  
                            $('#loginOnclick').css('background-color','#ed5345');  
                            $('#loginOnclick').attr('onclick','login(0)');  
                        }else{  
        //                  $("#loginPass").text("用户名或密码不正确!");  
        //                  $("#pass").val("");  
                            $(".password").parent().addClass("errorC");  
                            $(".error3").html("用户名或密码不正确!");  
                            $(".error3").css("display","block");  
                            $(".error1").css("display","none");  
                            $(".error2").css("display","none");  
                            $("#loginOnclick").html("登录");  
                            $('#loginOnclick').css('background-color','#ed5345');  
                            $('#loginOnclick').attr('onclick','login(0)');  
                        }  
                          
              
                    }  
                });  
            }else{  
                $.ajax({  
                    type : "POST",  
                    url : "ssl/logins.htm",                                                                 
                    dataType : "json",  
                    async : false,  
                    data:{    
                            "j_password" : $("#pass").val(),    
                            "j_username" : $("#phone").val(),    
                            "sign" : $("#sign").val(),  
                            "sig":$("#sig").val(),  
                            "token":$("#token").val(),  
                            "sessionId":$("#sessionId").val()  
                           },   
                    //data : $('#form').serialize(),  
                    success : function(data) {  
                        var pathName=window.document.location.pathname;  
                        var projectName=pathName.substring(0,pathName.substr(1).indexOf('/')+1);  
                        if(projectName!="/puhuilicai"){  
                            projectName="";  
                        }  
                        if (data.msg == 2){  
                            if(data.isRisk=='yes'){//进行风险拦截  
                                $("iframe",window.parent.document).attr("src",projectName+"/toLogins.htm");  
                            }else{  
                                if(data.isFirstLogin=='no'){  
                                    if(window.top==window.self){  //不存在父页面  
                                        window.location.href="https://www.baidu.com";  
                                     }else{  
                                        if(returnUrl!=''){  
                                            var index = parent.layer.getFrameIndex(window.name);  
                                            parent.location.href=returnUrl;  
                                            parent.layer.close(index);  
                                        }else{  
                                            parent.location.reload();  
                                        }  
                                     }  
                                }else{  
                                    var voucherName=data.voucherName.replace("%","*");  
                                    var index = parent.layer.getFrameIndex(window.name);  
                                    popWin.showWin("880","840","xxxx",projectName+"/ssl/loginSuccess.htm?integral="+data.integral+"&totalIntegral="+data.totalIntegral+"&loginDays="+data.loginDays+"&voucherName="+voucherName);   
                                    parent.layer.close(index);  
                                }  
                            }  
                        }else if(data.msg==1){  
                            window.location.href="ssl/account/toEntCenter.htm";  
                        }else if(data.msg==-1){  
                            $("#loginPhone").text("账号不存在");  
                            $("#phone").val("");  
                            $("#pass").val("");        
                        }else{  
                            $("#loginPass").text("用户名或密码不正确!");  
                            $("#pass").val("");  
                              
                        }  
                    }  
                });  
            }  
            return false;  
        }  
        function CheckEmpty(){  
            if($.trim($("#phone").val())==""){  
                  
                //$("#loginPhone").text("账号不能为空");  
                $(".phone").parent().addClass("errorC");  
                $(".error1").html("账号不能为空");  
                $(".error1").css("display","block");  
                $(".error2").css("display","none");  
                $(".error3").css("display","none");  
                return false;  
            }else{  
                //$("#loginPhone").text("");  
                $(".phone").parent().addClass("checkedN");  
            }  
        }  

    3.上面js中手机号和密码加密得到的sign有什么用呢,下面在Controller中看一下

    @ResponseBody  
        @RequestMapping(value="/ssl/logins",method = RequestMethod.POST)  
        public Map<String, String> logins(String afs_scene,String afs_token,String sig,String sessionId,String token,String sign,String j_username,String j_password,HttpServletRequest request,HttpSession session){  
            CustUser custUser = null;  
            Map<String,String> map = new HashMap<String, String>(1);  
            String flag = "0"; //失败  
            //连续登录天数  
            String loginDays = "1";   
            //增加的积分数  
            String integral ="0";  
            //是否每天第一次登录  
            String isFirstLogin ="yes";  
            //卡券名称  
            String voucherName ="0.1% 加息券";  
            //是否风险用户  
            String isRisk="no";  
            try{  
                if(signValidate(j_username,j_password,sign)){  
                    custUser = userRegisterService.getCustUserByAccountAndPassowd(j_username.toLowerCase().trim(),j_password);  
                    if(custUser!=null){  
                      
                        flag = custUser.getCustType().toString();  
                        if("no".equals(isRisk)){  
                            Long loginTime =null;  
                            CustUserLogin custUserLogin = userRegisterService.getLastLoginTime(custUser.getId());  
                            //判断是否每天第一次登录  
                            Map<String,String> result = userRegisterService.saveFirstLoginHandle(request, custUser, custUserLogin);  
                            loginDays=result.get("loginDays");  
                            isFirstLogin=result.get("isFirstLogin");  
                            voucherName=result.get("voucherName");  
                            loginTime = Long.valueOf(result.get("loginTime"));  
                            integral = result.get("integral");  
                              
                            custUser.setLoginTime(loginTime);  
                            if (custUser.getUserName().equals("")) {  
                                session.getServletContext().setAttribute(custUser.getMobile(),loginTime);  
                            }else{  
                                session.getServletContext().setAttribute(custUser.getUserName(),loginTime);  
                            }  
                            //对存入数据库中的密码进行解密放到session中-zzj-2016-4-7 14:31:42  
                            //custUser.setPassword(PassUtil.decode(custUser.getPassword()));  
                            session.setAttribute(Constants.USER,custUser);  
                            session.setAttribute(Constants.MOBILE_NUM,1);  
                            map.put("userId", custUser.getId().toString());  
                        }  
                          
                            Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\D])|(18[0-9]))\d{8}$");  
                            Matcher m = p.matcher(custUser.getUserName());  
                            if(m.matches()){  
                                String phone = custUser.getUserName() ;  
                                phone = phone.substring(0,3) + "****" + phone.substring(7, phone.length());  
                                session.setAttribute("userName", phone);  
                            }else{  
                                session.setAttribute("userName", custUser.getUserName());  
                            }  
                          
                    }else{  
                          
                        if(null==userRegisterService.getCustUserByMobile(j_username.trim()))  
                        {  
                            flag = "-1";  
                              
                        }  
                        isFirstLogin="no";  
                    }  
                }  
            }catch(Exception e){  
                logger.info(e.getMessage());  
                map.put("msg", "0");  
                return map;  
            }  
            //风险识别  
            map.put("isRisk",isRisk);  
            map.put("msg", flag);  
            map.put("isFirstLogin", isFirstLogin);  
            map.put("loginDays", loginDays);  
            map.put("integral", integral);  
            if("yes".equals(isFirstLogin)){  
                map.put("totalIntegral", integralService.getIntegralByUserId(custUser.getId()).toString());  
                map.put("voucherName", voucherName);  
            }  
      
            return map;  
        } 

    4.signValidate方法中,再一次对手机号和密码还要sign进行校验,具体看一下signValidate这个方法

    /* 登录完整性验证  
     * @param sign  
     * @return  
     */  
    private boolean signValidate(String account,String password,String sign){  
        StringBuffer signInfo = new StringBuffer();  
        signInfo.append(account);  
        signInfo.append(password);  
        return sign.equals(DigestUtils.md5Hex(signInfo.toString()));  
    }  
     public static String md5Hex(final byte[] data) {  
          return Hex.encodeHexString(md5(data));  
    }
    public static String encodeHexString(final byte[] data) {  
            return new String(encodeHex(data));  
        }  
          
    public static char[] encodeHex(final byte[] data) {  
            return encodeHex(data, true);  
        } 
    public static byte[] md5(final String data) {  
            return md5(StringUtils.getBytesUtf8(data));  
        }  
    public static byte[] getBytesUtf8(final String string) {  
            return getBytes(string, Charsets.UTF_8);  
        } 

     登录这块还要很多功能在这里就不细说了,我主要是觉得这里的加密和检验工作做得比较好,记录一下,方便以后的使用和学习。

  • 相关阅读:
    cmcc_simplerop
    WeiFenLuo.winFormsUI.Docking.dll的使用
    MySQL转换Oracle的七大注意事项
    icsharpcode
    详细介绍IIS7基于WAS 部署WCF服务《收藏》
    Win2008 IIS7日期格式更改方法 《转》
    SVCUtil使用说明(生成代理类)《收藏》
    Oracle中的高效语句
    WCF配置文件全攻略《收藏》
    设计高效合理的MySQL查询语句
  • 原文地址:https://www.cnblogs.com/leibao/p/8202804.html
Copyright © 2020-2023  润新知