zoukankan      html  css  js  c++  java
  • 用java来实现验证码功能(本帖为转载贴),作为个人学习收藏用

    一、关于为何使用验证的解释

         在目前的网页的登录、注册中经常会见到各种验证码。其目的便是为了:防止暴力破解  .因为只要CPU性能较强,便可以在慢慢尝试密码的过程中来破解用户账号,因而导致的结果是用户信息不安全。


    但是如果使用验证码,一旦用户输入的密码或账号不正确时,验证码也会立马改变,这样便在一定程度上实现了安全性。


    二、利用Java代码来实现验证码功能

          为了避免上面原因造成的结果,Java中提供了相应的方法来实现验证功能。
    1.创建一个servlet在其中写下面代码
    (1)在doGet方法中
    1. public void doGet(HttpServletRequest request, HttpServletResponse response)  
    2.             throws ServletException, IOException {  
    3.         test2(response);  
    4.           
    5.     }  
    (2)单独提出来的test2方法中
    1. private void test2(HttpServletResponse response) throws IOException{  
    2.         int width=110;  
    3.         int height=25;  
    4.         //1.在内存中创建一个图像对象  
    5.         BufferedImage img=new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);// 构造一个类型为预定义图像类型之一的 BufferedImage。  
    6.                                                                                         //表示一个具有 8 位 RGB 颜色分量的图像,对应于 Windows 或 Solaris 风格的 BGR 颜色模型,具有打包为整数像素的 Blue、Green 和 Red 三种颜色。                 
    7.         //2.创建一个画笔  
    8.         Graphics g=img.getGraphics();   
    9.           
    10.         //3给背景图片添加一个颜色  
    11.         g.setColor(Color.PINK);  
    12.         g.fillRect(1, 1, width-2, width-2);//建议使用IE浏览器访问,Google浏览器和获取均显示为居中的图片,ie显示左上角  
    13.           
    14.         //4.给边框一个色  
    15.         g.setColor(Color.RED);  
    16.         g.drawRect(0, 0, width-1, height-1);  
    17.           
    18.         //5.设置文本样式  
    19.         g.setColor(Color.BLUE);  
    20.         g.setFont(new Font("宋体",Font.BOLD|Font.ITALIC,15));//Font对象 ----根据指定名称、样式和磅值大小,创建一个新 Font。  
    21.           
    22.         //6.给图片添加文本  
    23.         Random rand=new Random();  
    24.         int position=20;  
    25.         for(int i=0;i<4;i++){  
    26.             g.drawString(rand.nextInt(10)+"", position, 20);//给图片填充文本  
    27.             position+=20;  
    28.         }  
    29.           
    30.         //7.将图片以对象流的方式输出到客户端  
    31.         ImageIO.write(img, "jpg", response.getOutputStream());  
    32.     }  

    得到的结果是(在IE浏览器中的显示效果,如果在Google浏览器、火狐浏览器中将会显示在屏幕中间,且周围为黑色):


    通常见到的验证码显示在登录、注册中。所以讲验证码内容放在html中

    (3)在NewFile.html中
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    2. <html>  
    3. <head>  
    4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    5. <title>Insert title here</title>  
    6. <script type="text/javascript">  
    7.     //得到图片元素  
    8.     function changeCode(){  
    9.         var img = document.getElementsByTagName("img")[0];  
    10.         img.src = "/ee10_request_response/servlet/ServletDemo01";  
    11.     }  
    12. </script>  
    13. </head>  
    14. <body>  
    15.     <form action="#" method="post">  
    16.         用户名:<input type="text" name="username"/><br/>  
    17.         密码:<input type="password" name="psw"/><br/>  
    18.         验证码:<input type="text" name="code"/>  
    19.         <img src="/ee10_request_response/servlet/ServletDemo01" onclick="changeCode()"/><href="javascript:changeCode()">看不清换一张</a><br/>  
    20.         <input type="submit" value="登录"/><br/>  
    21.     </form>  
    22. </body>  
    23. </html>  
    得到的结果如下:

    上面的验证码虽然得到了,但是点击更换验证码时,却没有立马更改,这是为什么呢?

    三、浏览器缓存

    1.问题提出
    在上面的html中,由于点击“看不清换一张”或点击图片时,javascript的导向地址是同一个地址。浏览器将会认为是一样的,故不会进行刷新验证码。为了解决上面的问题,可以 在html中进行以下的更改



    这种方法虽然实现了当点击更换验证码时,验证码得到了改变,但是也同时存在问题。那便是当点击一次后,验证码更换,但再次点击时由于同样有缓存,所以验证码值改变一次


    2.解决方案

    由于时间总是改变的,并且永不相等。所以可以利用获取当前时间的方法来改变。利用Date().getTime()方法来获取当前时间


    通过以上方法便可以成功解决存在的问题。

    四、利用验证码工具ValidateCode来实现

    由于Java提供了ValidateCode这个jar包,所以变不需要再进行人工编写代码来实现

    (1)在servlet中写以下代码

    1. public void doGet(HttpServletRequest request, HttpServletResponse response)  
    2.             throws ServletException, IOException {  
    3.         ValidateCode vc=new ValidateCode(110,25,4,9);  
    4.         String code=vc.getCode();  
    5.         vc.write(response.getOutputStream());  
    6.           
    7.     }  

    得到的结果:

    同样可以进行上面的验证改变,但是同样存在问题:浏览器会产生缓存,一旦刷新页面验证本来应该改变,但实际上并没有改变。


    (2)解决方案

    在servlet中写下以下代码:

    1. public void doGet(HttpServletRequest request, HttpServletResponse response)  
    2.             throws ServletException, IOException {  
    3.         //告诉客户端不使用缓存  
    4.         response.setHeader("param", "no-cache");  
    5.         response.setHeader("cache-control", "no-cache");  
    6.         response.setIntHeader("expires", 0);  
    7.           
    8.         ValidateCode vc=new ValidateCode(110,25,4,9);  
    9.         String code=vc.getCode();  
    10.         vc.write(response.getOutputStream());  
    11.     }  


    五、总结

    以上便是我对于Java中验证码的使用以及ValidateCode工具使用的较浅认识。一般情况下使用较多的是工具类,但是必须牢记浏览器缓存的因素。以上的总结如果存在错误,期望能及时提出,谢谢!
  • 相关阅读:
    django 项目需要注意的一些点
    VUE之路
    Oracle 表格碎片的查看方法
    RHEL 6.x or 7.x 使用分区绑定ASM 磁盘的方法
    RMAN 修复主库 nologging 操作导致物理备库的坏块
    Oracle 数据库19c 回退降级到 11.2.0.4 方案
    如何评估oracle 数据库rman全备和增量备份大小
    在将Oracle GI和DB升级到19c或降级到以前的版本之前需要应用的补丁 (Doc ID 2668071.1)
    Oracle 数据库坏块处理
    opatch auto 安装11.2.0.4.20190115 PSU遇到 OUI-67133: Execution of PRE script failed,with returen value 1 报错
  • 原文地址:https://www.cnblogs.com/RunningSir/p/6972758.html
Copyright © 2011-2022 走看看