JavaWeb 使用Session实现一次性验证码
程序员文章站
2022-05-20 21:40:40
表单 载入页面时,会自动请求getCodeServlet,获取图片(验证码)。 getCodeServlet,产生验证码 loginServlet,处理表单 上面的处理方式要区分验证码的大小写。 不区分大小写: ......
表单
<form action="loginservlet" method="post"> 请输入验证码:<input type="text" name="code" /> <img src="getcodeservlet" /><br /> <button type="submit">提交</button> </form>
载入页面时,会自动请求getcodeservlet,获取图片(验证码)。
getcodeservlet,产生验证码
1 @webservlet("/getcodeservlet") 2 public class getcodeservlet extends httpservlet { 3 //验证码的宽、高 4 private static int width=80; 5 private static int height=25; 6 7 //绘制背景 8 private void drawbg(graphics g){ 9 //rgb 10 g.setcolor(new color(128, 128, 128)); 11 //绘制矩形。x,y,wigth,height 12 g.fillrect(0,0,width,height); 13 //随机绘制100个干扰点 14 random random=new random(); 15 for (int i=0;i<100;i++){ 16 //产生(0,1)上的小数,*width|height,再取整也行 17 int x=random.nextint(width); 18 int y=random.nextint(height); 19 g.drawoval(x,y,1,1); 20 21 //干扰点的颜色也可以随机,随机产生red,green,blue即可 22 //g.setcolor(new color(red,green,blue)); 23 } 24 } 25 26 27 //绘制验证码 28 private void drawcode(graphics g,char[] code){ 29 g.setcolor(color.black); 30 //字体、样式(多个时竖线分隔)、字号 31 g.setfont(new font("serif",font.italic|font.bold,18)); 32 //在不同位置绘制验证码字符,参数:要绘制的string、横、纵坐标。+""是为了char转string。 33 g.drawstring(code[0]+"",1,17); 34 g.drawstring(code[1]+"",16,15); 35 g.drawstring(code[2]+"",31,18); 36 g.drawstring(code[3]+"",46,16); 37 } 38 39 //随机产生4位验证码 40 private char[] getcode(){ 41 string chars="0123456789qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnm"; 42 char[] code=new char[4]; 43 random random=new random(); 44 for (int i=0;i<4;i++){ 45 //[0,62) 46 int index= random.nextint(62); 47 code[i]=chars.charat(index); 48 } 49 return code; 50 } 51 52 53 protected void dopost(httpservletrequest request, httpservletresponse response) throws ioexception { 54 httpsession session = request.getsession(); 55 servletoutputstream sos = response.getoutputstream(); 56 response.setcontenttype("image/jpeg"); 57 58 //设置浏览器不缓存此图片 59 response.setheader("pragma","no-cache"); 60 response.setheader("cache-control","no-cache"); 61 response.setdateheader("expires",0); 62 63 //创建内存图片 64 bufferedimage bufferedimage = new bufferedimage(width, height, type_int_rgb); 65 graphics g= bufferedimage.getgraphics(); 66 char[] code=getcode(); 67 //将验证码放到session域中。session对象要在提交响应之前获得 68 session.setattribute("code",new string(code)); 69 drawbg(g); 70 drawcode(g,code); 71 g.dispose(); 72 73 //将图片输出到浏览器 74 bytearrayoutputstream baos = new bytearrayoutputstream(); 75 imageio.write(bufferedimage,"jpeg",baos); 76 baos.writeto(sos); 77 baos.close(); 78 sos.close(); 79 } 80 81 protected void doget(httpservletrequest request, httpservletresponse response) throws ioexception { 82 dopost(request,response); 83 } 84 }
loginservlet,处理表单
1 @webservlet("/loginservlet") 2 public class loginservlet extends httpservlet { 3 protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { 4 response.setcontenttype("text/html;charset=utf-8"); 5 httpsession session = request.getsession(); 6 string truecode= (string) session.getattribute("code"); 7 string code=request.getparameter("code"); 8 9 if (code.equals(truecode)){ 10 response.getwriter().write("验证码正确"); 11 } 12 else { 13 response.getwriter().write("验证码错误"); 14 } 15 } 16 17 protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { 18 dopost(request,response); 19 } 20 }
上面的处理方式要区分验证码的大小写。
不区分大小写:
//先转换为全大写|全小写,再判断 truecode=truecode.tolowercase(); code=code.tolowercase(); //truecode=truecode.touppercase(); //code=truecode.touppercase();
推荐阅读
-
使用PHP会话(Session)实现用户登陆功能
-
使用表类型(Table Type-SqlServer)实现百万级别的数据一次性毫秒级别插入
-
ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能示例
-
PHP使用Session实现上传进度功能详解
-
使用python PIL库实现简单验证码的去噪方法步骤
-
PHP使用Redis实现Session共享的实现示例
-
nginx+tomcat实现负载均衡,使用redis session共享
-
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
-
Laravel5.2使用Captcha生成验证码实现登录(session巨坑)
-
JavaWeb 使用Session实现一次性验证码