验证码
地址:
概述
介绍:
验证码功能位于cn.hutool.captcha
包中,核心接口为ICaptcha
,此接口定义了以下方法:
createCode
创建验证码,实现类需同时生成随机验证码字符串和验证码图片getCode
获取验证码的文字内容verify
验证验证码是否正确,建议忽略大小写write
将验证码写出到目标流中
操作
一、引入jar包
在 web-inf 目录下引入
二、创建servlet
在servlet里获取验证码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//定义图形验证码的长、宽、验证码字符数、干扰元素个数CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);//CircleCaptcha captcha = new CircleCaptcha(200, 100, 4, 20);//图形验证码写出,可以写出到文件,也可以写出到流//captcha.write("d:/circle.png");//验证图形验证码的有效性,返回boolean值//System.out.println(captcha.verify("1234"));//写出到浏览器(Servlet输出)//获取验证码的内容// System.out.println(captcha.getCode());captcha.write(response.getOutputStream());}
三、在前端需要加验证码的地方
img 访问servlet
<div class="yanzheng"><input type="text" placeholder="验证码" maxlength="25" class="code"><img src="CaptchaServlet" alt="" onclick="this.src=this.src+'?'"></div>
实现点击验证码,验证码发生变化:
在 jquery 中,有
$("img").click(function(){alert(1)})
这里简单,直接在body加
<img src="CaptchaServlet" alt="" onclick="CaptchaServlet">
可以这样,但是第二次和第一次名字一样,不会发生变化。
故应用 ? 实现
<img src="CaptchaServlet" alt="" onclick="this.src=this.src+'?'">
三、设置 session 传前端获取到的验证码值
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//定义图形验证码的长、宽、验证码字符数、干扰元素个数CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);//CircleCaptcha captcha = new CircleCaptcha(200, 100, 4, 20);//图形验证码写出,可以写出到文件,也可以写出到流//captcha.write("d:/circle.png");//验证图形验证码的有效性,返回boolean值//System.out.println(captcha.verify("1234"));//写出到浏览器(Servlet输出)//获取验证码的内容// System.out.println(captcha.getCode());HttpSession session = request.getSession(true);session.setAttribute("verifycode", captcha.getCode());captcha.write(response.getOutputStream());}
四、在后端登录servlet里接收session值,判断
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置后端给前端返回的数据为json格式response.setContentType("text/json;charset=utf-8");//获取前端传过来的参数String code=request.getParameter("code");HttpSession session = request.getSession(false);if(session!=null) {String savedcode=(String) session.getAttribute("verifycode");if(savedcode!=null) {if(savedcode.equalsIgnoreCase(code)) {String acc=request.getParameter("account");String pss=request.getParameter("password");//拼接sqlString sql="select count(*) from login where account=\""+acc+"\" and password=\""+pss+"\"";//查找int num=MysqlUtil.getCount(sql);//返回的数据String res="{\"code\":0,\"message\":\"登陆失败\"}";if(num>0) {res="{\"code\":1,\"message\":\" 登陆成功\"}";//登陆成功session.setAttribute("account", acc);}//返回数据response.getWriter().write(res);}else {String res="{\"code\":-1,\"message\":\"验证码错误,请重新输入\"}";response.getWriter().write(res);}}}}
五、js接收返回值
实现验证码错误 清空验证码输入框的值
//发起请求$.ajax({url:"LoginServlet",//请求路径type:"get",//请求方式data:{account,password,code},success:function(value){alert(value.message)if(value.code==1){location.href="RouterServlet?path=登录页面后"}else if(value.code==-1){//验证码错误$(".code").val("")$("img").click()}else{//登录失败清除输入框中的信息$(".account").val("")$(".password").val("")}},error:function(){alert("登录的请求失败")}})