formValidator输入验证、异步验证实例 + licenseImage验证码插件实例应用

实例技术:springmvc 

实现功能:完整用户登录流程、输入信息规则校验、验证码异步校验.

功能清单

1.springmvc控制器处理get请求(/member/login.html),进行静态页面跳转到用户登录页

2.Springmvc控制器处理post请求(/member/login.html),进行登录实际业务处理

3.验证实例包含常规输入验证 异步验证,使用验证插件formValidator

插件下载:

验证插件下载:http://www.cnblogs.com/wzmaodong/archive/2012/10/15/2724005.html [猫冬博客]

验证码插件下载http://www.cnblogs.com/dennisit/p/3325871.html [苏若年博客]

实例效果:

前端登录样式效果

 <div class="content-wp">
        <!--登录开始-->
        <div class="login-form">
            <form action="" method="post" name="formLogin" id="formLogin">
                <dl>
                    <dt>帐户基本信息</dt>
                     <dd>
                        <span class="title">登录邮箱:</span>
                        <input class="login_input" name="email" type="text" id="email"/>
                        <span id="emailTip" class="onshow"></span>
                    </dd>
                    <dd>
                        <span class="title">登录密码:</span>
                        <input class="login_input" id="password" name="password"  type="password"/>
                        <span id="passwordTip" class="onshow"></span>
                    </dd>
                   
                    <dd style="heigth:50px;">
                        <span class="title">验证码:</span>
                        <img class="img" id="licenImg" src="${ctx }/licenseImg/loadImage.html?type=5" width="115" height="40" />
                        <span class="chimgbox">
                            <a href="javascript:void(0);" id="changeImg">看不清?换一张</a>
                        </span>
                    </dd>
                    <dd>
                        <span class="title">输入验证码:</span>
                        <input type="text" id="checkcode" class="login_input" name="checkcode" maxlength="4" />
                        <span id="checkcodeTip" class="onshow">请输入验证码</span>
                    </dd>
                </dl>
                <div class="login_btn_box">
                    <input id="button" name="button" type="submit" value="免费注册" class="login_btn"/>
                    <span class="clew_txt">如果您已有帐号,可<a href="javascript:void(0);">直接登录</a></span>
                </div>
            </form>                              
        </div>
        <!--登录结束-->        
    </div>
View Code

这里验证码使用自己搞得一个验证码插件.

<img class="img" id="licenImg" src="${ctx }/licenseImg/loadImage.html?type=5" width="115" height="40" />

里边的type用来指定内置的验证码样式

使用formValidator实现前端验证

1.常规验证

            //登录邮箱验证
            jQuery("#email").formValidator({
                onshow:"6-100个字符",
                onfocus:"6-100个字符",
                oncorrect:"恭喜你,你输对了",
                defaultvalue:"@"
            }).inputValidator({
                min:6,
                max:100,
                onerror:"长度非法"
            }).regexValidator({
                regexp:"^([\\w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([\\w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$",
                onerror:"格式不正确"
            });

参数说明:

onshow:表示页面加载上来先是的内容

onfocus:表示输入框获取得焦点之后的内容

oncorrect:表示输入正确后的信息

defaultvalue:表示输入框默认值

Onerror:表示验证不通过的错误提示.

2.异步验证

            //验证码验证相关
            jQuery("#checkcode").formValidator({
                onshow:"请输入验证码",
                onfocus:"验证码为4个字符",
                oncorrect:"恭喜你,你输对了"
            }).ajaxValidator({
                //请求方式post
                type: "post",                                
                //请求处理执行方法,这里采用相对路径
                datatype: "json",
                oncorrect:"验证码正确",
                url: "${ctx}/licenseImg/validImage.html?tm=" + new Date().getTime(),    
                //请求携带的参数值
                success: function(result) {        //返回的josn串
                    if(result==1){
                        return true;            //值不是1表示验证码输入错误
                    }else{
                        return false;            //表示验证码输入正确
                    }
                   },
                   oncorrect:"恭喜你,你输对了",
                onerror: "验证码错误,请重新输入",
                onwait : "正在检测验证码,请稍候..."
            });
            

说明:ajaxValidator({...});里边执行异步验证,需要说明的是这里验证传递参数,url中无需带入要验证的内容参数,因为带了也不起作用.比如我这里验证码的输入框Id值为checkcode,而这里url:"${ctx}/licenseImg/validImage.html?validimgvalue=" + jQuery("#checkcode").val(),这种写法,然后再服务端我们用request.getParameter("validimgvalue")获取参数的话获取的是页面初始加载的值,而不是我们输入的值.所以这里的异步验证只要保证request.getParameter("输入框name")一致,然后使用时间戳保证不缓存就可以在服务端获取到每次输入的值了.

前端验证完整实例

    <link rel="stylesheet" type="text/css" href="${ctx }/styles/common/common.css">
    <link rel="stylesheet" type="text/css" href="${ctx }/styles/member/member_login.css">
    
    <script src="${ctx }/scripts/jquery-1.2.6.min.js" type="text/javascript" charset="UTF-8"></script>
    <script src="${ctx }/scripts/form-validator_min.js" type="text/javascript" charset="UTF-8"></script>
    <script src="${ctx }/scripts/member/member_login.js" type="text/javascript" charset="UTF-8"></script>
    
    <script type="text/javascript">
        jQuery.noConflict();
    </script>
    <script type="text/javascript">
        jQuery(document).ready(function(){
            jQuery.formValidator.initConfig({
                formid:"formLogin",
                debug:false,
                submitonce:true,
                onerror:function(msg,obj,errorlist){
                    alert(msg);
                }
            });
            
            //登录邮箱验证
            jQuery("#email").formValidator({
                onshow:"6-100个字符",
                onfocus:"6-100个字符",
                oncorrect:"恭喜你,你输对了",
                defaultvalue:"@"
            }).inputValidator({
                min:6,
                max:100,
                onerror:"长度非法"
            }).regexValidator({
                regexp:"^([\\w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([\\w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$",
                onerror:"格式不正确"
            });
            
            //登录密码验证
            jQuery("#password").formValidator({onshow:"至少6个字符",onfocus:"至少6个字符",oncorrect:"密码合法"}).inputValidator({min:6,empty:{leftempty:false,rightempty:false,emptyerror:"输入有误"},onerror:"输入有误"});
                                
            //验证码验证相关
            jQuery("#checkcode").formValidator({
                onshow:"请输入验证码",
                onfocus:"验证码为4个字符",
                oncorrect:"恭喜你,你输对了"
            }).ajaxValidator({
                //请求方式post
                type: "post",                                
                //请求处理执行方法,这里采用相对路径
                datatype: "json",
                oncorrect:"验证码正确",
                url: "${ctx}/licenseImg/validImage.html?tm=" + new Date().getTime(),    
                //请求携带的参数值
                success: function(result) {        //返回的josn串
                    if(result==1){
                        return true;            //值不是1表示验证码输入错误
                    }else{
                        return false;            //表示验证码输入正确
                    }
                   },
                   oncorrect:"恭喜你,你输对了",
                onerror: "验证码错误,请重新输入",
                onwait : "正在检测验证码,请稍候..."
            });
            
            /*点击更换验证码的方法*/
            jQuery("#changeImg").click(function(){
                var path = "${ctx}";
                var url = path + "/licenseImg/loadImage.html?type=5&tm=" + new Date().getTime();
                jQuery("#licenImg").attr("src",url);
            });
            
        });        
        
    </script>

3.验证码插件将样式交给前段控制实现

@Controller
@RequestMapping("/licenseImg")
public class LicenseImageController extends BaseMultiController{

    /**
     * 生成验证码
     *
     * @author <a href='mailto:dennisit@163.com'>Cn.pudp(En.dennisit)</a> Copy Right since 2013-11-5 下午03:45:51
     *                
     * @param request
     * @param response
     * @throws ControllerException
     * @throws IOException
     */
    @RequestMapping(value={"/loadImage","/loadImage.html"},method={RequestMethod.GET})
    public void licenseImage(HttpServletRequest request, HttpServletResponse response)throws ControllerException,IOException{
        String type = request.getParameter("type");
        
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        response.setContentType("image/jpeg");

        LicenseImage licenseImage = new LicenseImage();
        
        Map<String, BufferedImage> licenseImg = licenseImage.createImage("org/pudp/util/license/resources/yzm" + type +".png");
                
        String key = (String) licenseImg.keySet().iterator().next();
        
        SessionUtil.getSession(request).setAttribute(CommonConstant.LicenseImageKey,key);
        System.out.println("session中的验证码值为:" + key);
        
        BufferedImage buffImg = licenseImg.get(key);
        ServletOutputStream out = response.getOutputStream();
        ImageIO.write(buffImg, "jpeg", out);
        out.close();    
    }
    
    
    /**
     * 验证验证码是否输入正确
     *
     * @author <a href='mailto:dennisit@163.com'>Cn.pudp(En.dennisit)</a> Copy Right since 2013-11-5 下午04:09:47
     *                
     * @param request
     * @param response
     * @throws ControllerException
     */
    @RequestMapping(value={"/validImage","/validImage.html"},method={RequestMethod.GET,RequestMethod.POST})
    public void validateLicenseImage(HttpServletRequest request, HttpServletResponse response)throws ControllerException{
        int status = -1;
        String imageVal = StringUtil.getString(request, "checkcode");
        String imageSessionVal = (String) SessionUtil.getSession(request).getAttribute(CommonConstant.LicenseImageKey);
        System.out.println("用户输入的值:" + imageVal + ",session中存放的值:" + imageSessionVal);
        if(imageSessionVal.equalsIgnoreCase(imageVal)){
            //如果相等,表示验证码输入正确
            status = 1;
        }
        JsonUtil.str2Json(status+"", response);
    }
    
    @Override
    public Logger getLogger() {
        return Logger.getLogger(this.getClass());
    }

}

转载请注明出处:[http://www.cnblogs.com/dennisit/p/3410147.html]

给我留言

posted @ 2013-11-06 11:30  苏二  阅读(2480)  评论(1编辑  收藏  举报