在javaweb的用户注册与登陆功能时,有时为了防止漏洞或者大量注册,可以使用验证码功能,下面是验证码的一个简单实现

验证码类

public class ValiImg extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setDateHeader("Expires", -1);response.setHeader("Cache-Control", "no-Cache");response.setHeader("pragma", "no-Cache");int height = 30;int width = 30*4;BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);Graphics2D g =  (Graphics2D) image.getGraphics();//1.填充矩形g.setColor(Color.GREEN);g.fillRect(0, 0, width, height);//2.画边框g.setColor(Color.BLACK);g.drawRect(0, 0, width-1, height-1);//3.话干扰线g.setColor(Color.RED);for(int i = 0;i<5;i++){g.drawLine(getRandInt(0,width), getRandInt(0,height), getRandInt(0,width), getRandInt(0,height));}//4.随机生成字符写到图片上 String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6";g.setFont(new Font("宋体",Font.BOLD,20));g.setColor(Color.BLACK);StringBuffer buffer = new StringBuffer();for(int i=0;i<4;i++){double c = getRandInt(-45, 45)/180F*Math.PI;g.rotate(c, 5+width/4*i, 22);String s = base.charAt(getRandInt(0,base.length()-1))+"";buffer.append(s);g.drawString(s, 5+width/4*i, 22);g.rotate(-c, 5+width/4*i, 22);}System.out.println(buffer.toString());request.getSession().setAttribute("valistr", buffer.toString());//5.释放资源g.dispose();//6.利用ImageIO进行输出ImageIO.write(image, "jpg", response.getOutputStream());}Random random = new Random();public int getRandInt(int begin,int end){return random.nextInt(end-begin)+begin;}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

HTML可以动态刷新验证码

<tr><td>验证码:</td><td><input type="text" name="valistr"/></td><td id="valistr_msg">${msg }</td></tr><tr><td><input type="submit" value="注册用户"/></td><td><img src="ValiImg" onclick="changeImg(this)" style="cursor: pointer;"/></td>function changeImg(img){img.src=img.src+"?time="+new Date().getTime();}

在servlet中校验验证码是否正确


//较验验证码
String valistr1=request.getParameter("valistr");
String valistr2=(String) request.getSession().getAttribute("valistr");
if(valistr1==null||valistr2==null||!valistr1.equals(valistr2))
{
request.setAttribute("msg", "<font color='red'>验证码不正确!</font> ");
request.getRequestDispatcher("register.jsp").forward(request, response);
return;
}

效果如下

javaweb实现验证码功能相关推荐

  1. java输入验证码代码,JavaWeb 实现验证码功能(demo)

    验证码不用多说,在 WEB-APP 中一般应用于:登录.注册.买某票.秒杀等场景.大家都接触过~可以说是千奇百怪,各式各样. DEMO 目标功能 验证码页面输入. 页面更换验证码(异步实现). 后台验 ...

  2. SSM+MyBatis-Plus+EasyExcel+腾讯云tianai滑动验证码接入项目搭建+简单实现增、删、改、查、导入、滑动验证码功能

    SSM+MyBatis-Plus+EasyExcel+腾讯云&tianai滑动验证码接入项目搭建+简单实现增.删.改.查.导入.滑动验证码功能 文章末尾附源码 一.什么是SSM框架 SSM框架 ...

  3. JavaWeb Servlet 登录功能 注销功能

    JavaWeb Servlet 登录功能 注销功能 有三个逻辑: 处理登陆的逻辑,用户主页的逻辑,退出登录逻辑 登陆的逻辑LoginServlet.java import java.io.IOExce ...

  4. html表单输入框添加验证码,织梦Dedecms为自定义表单添加验证码功能

    使用织梦Dedecms自定义表单的时候,即使你做了字段的验证,也很有可能被人刷很多垃圾的内容,更加安全的一个方法是为自定义表单添加上验证码功能.今天我就来为大家分享一下怎样给自定义表单添加验证码! 一 ...

  5. java生成验证码实例_Java生成验证码功能实例代码

    页面上输入验证码是比较常见的一个功能,实现起来也很简单.给大家写一个简单的生成验证码的示例程序,需要的朋友可以借鉴一下. 闲话少续,直接上代码.代码中的注释很详细. package com.SM_te ...

  6. 验证码实现php 难点,php实现简单的验证码功能

    php实现简单的验证码功能<?php //简单的验证码 //随机数 //为什么要循环0-15之间的数呢? //因为要实现最简单的字母和数字混搭 //十六进制0-9 a-f //dechex -- ...

  7. vue 插件 滑块验证_VUE接入腾讯验证码功能(滑块验证)备忘

    最近在用VUE做个简单的用户系统,登录注册需要验证码,想找个那种拖动的,找geetest居然已经不面向小客户了(或者说只有收费套餐). 腾讯防水墙的验证码免费使用,有2000/小时的免费额度,对于小网 ...

  8. TP5 验证码功能实现(解决点击验证码不更新的问题)

    ThinkPHP5.0 已经很久了,最近有所接触,下面介绍一下常用的第三方验证码功能的使用. 功能开发 1).引入第三方扩展包 进行 TP5 的开发,Composer 的使用会成为重要技能  以win ...

  9. thinkphp验证码功能

    Think\Verify类可以支持验证码的生成和验证功能. 为了显示这个验证码功能,第一要有控制器,再就是有方法,然后是显示的页面. 一.最简单的方式生成验证码 (1)我们还是继续在那个控制器编写方法 ...

最新文章

  1. js获取当前系统时间
  2. 数控四轴四面 CUBE 应用的软件开发
  3. Mybatis系列(三):Mybatis实现关联表查询
  4. 多线程下HashMap的死循环
  5. 【数据结构】集合及运算
  6. SAP UI5 web Component里的条件渲染机制
  7. 邮政银行贷款迟还4个小时就造成信用逾期,如何解决?
  8. lua loadstring传递参数_lua学习之函数篇
  9. python中content的用法_学python吗,教你5个python现学现用的有趣用法
  10. windows 7 提示缺少D3DCOMPILER_47.dll的正确解决方法
  11. 热烈庆祝排名进入5000
  12. 365锦鲤助手修改版,砍价小程序
  13. 国内 OA 办公自动化系统 现状
  14. mysql proxy maxscale_maxscale参数配置
  15. 嵌入式软件设计(freertos使用)
  16. 今日头条推荐算法原理
  17. ADL SDK V10.2 中文文档
  18. MATLAB:Radon正变换的理解
  19. 影响到网站收录有哪些方面呢
  20. 对比:空洞卷积与转置卷积(吉米王)

热门文章

  1. 对比学习效果差?谷歌提出弱语义负样本,有效学习高级特征!
  2. 科研福利!国内TOP3的超算中心,免费领2000核时计算资源
  3. 2019年终总结与新年重磅福利
  4. 阿里P8架构师谈:MySQL行锁、表锁、悲观锁、乐观锁的特点与应用
  5. Restful、SOAP、RPC、SOA、微服务之间的区别
  6. 研究综述 | 知识图谱划分算法研究综述
  7. 【Brain】脑智前沿科普|用数学解释大脑学习的过程
  8. Linux memcached
  9. VM虚拟机上的CentOS 7系统重置root用户密码
  10. c++ object model