登录生成随机验证码

原创 2018年04月17日 11:34:54

登录+验证码。

验证码生成是单独的一个servlet,通过web.xml进行拦截。

先贴web.xml配置代码,很简单。

[html] view plain copy
  1. <servlet>  
  2.     <servlet-name>/CheckCode</servlet-name>  
  3.     <servlet-class>com.wswhr.LoginServer.servlet.CheckCode</servlet-class>  
  4. </servlet>  
  5. <servlet-mapping>  
  6.     <servlet-name>/CheckCode</servlet-name>  
  7.     <url-pattern>/CheckCode</url-pattern>  
  8. </servlet-mapping>  

然后,是这个checkCode的代码。

[java] view plain copy
  1. package com.wswhr.LoginServer.servlet;  
  2.   
  3. import java.awt.Color;  
  4. import java.awt.Font;  
  5. import java.awt.Graphics;  
  6. import java.awt.image.BufferedImage;  
  7. import java.io.ByteArrayOutputStream;  
  8. import java.io.IOException;  
  9.   
  10. import javax.imageio.ImageIO;  
  11. import javax.servlet.ServletException;  
  12. import javax.servlet.ServletOutputStream;  
  13. import javax.servlet.http.HttpServlet;  
  14. import javax.servlet.http.HttpServletRequest;  
  15. import javax.servlet.http.HttpServletResponse;  
  16. import javax.servlet.http.HttpSession;  
  17.   
  18. //import cn.com.daxtech.framework.security.UidPwdAuthenticationFilter;  
  19.   
  20. @SuppressWarnings("serial")  
  21. public class CheckCode extends HttpServlet  
  22.   
  23. {  
  24.     private static int WIDTH = 60;  
  25.     private static int HEIGHT = 20;  
  26.   
  27.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  28.             throws ServletException, IOException {  
  29.         HttpSession session = request.getSession();  
  30.         response.setContentType("image/jpeg");  
  31.         ServletOutputStream sos = response.getOutputStream();  
  32.         // 设置浏览器不要缓存此图片   
  33.         response.setHeader("Pragma""No-cache");  
  34.         response.setHeader("Cache-Control""no-cache");  
  35.         response.setDateHeader("Expires"0);  
  36.   
  37.         // 创建内存图象并获得其图形上下文   
  38.         BufferedImage image = new BufferedImage(WIDTH, HEIGHT,  
  39.                 BufferedImage.TYPE_INT_RGB);  
  40.         Graphics g = image.getGraphics();  
  41.   
  42.         // 产生随机的认证码   
  43.         char[] rands = generateCheckCode();  
  44.         // 产生图像   
  45.         drawBackground(g);  
  46.         drawRands(g, rands);  
  47.         // 结束图像 的绘制 过程, 完成图像   
  48.         g.dispose();  
  49.         // 将图像输出到客户端   
  50.         ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  51.         ImageIO.write(image, "JPEG", bos);  
  52.         byte[] buf = bos.toByteArray();  
  53.         response.setContentLength(buf.length);  
  54.         // 下面的语句也可写成: bos.writeTo(sos);   
  55.         sos.write(buf);  
  56.         bos.close();  
  57.         sos.close();  
  58.         // 将当前验证码存入到 Session 中   
  59.         session.setAttribute("validateCode"new String(rands));  
  60.         //session.setAttribute(UidPwdAuthenticationFilter.VALIDATE_CODE, new String(rands));  
  61.         // 直接使用下面的代码将有问题, Session 对象必须在提交响应前获得   
  62.         //request.getSession().setAttribute("check_code",new String(rands));   
  63.     }  
  64.   
  65.     private char[] generateCheckCode() {  
  66.         // 定义验证码的字符表   
  67.         String chars = "2345678abcdefghjkmnprstuwxz";  
  68.         char[] rands = new char[4];  
  69.         for (int i = 0; i < 4; i++) {  
  70.             int rand = (int) (Math.random() * chars.length());  
  71.             rands[i] = chars.charAt(rand);  
  72.         }  
  73.         return rands;  
  74.     }  
  75.   
  76.     private void drawRands(Graphics g, char[] rands) {  
  77.         g.setColor(Color.BLACK);  
  78.         g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));  
  79.         // 在不同的高度上输出验证码的每个字符            
  80.         g.drawString("" + rands[0], 117);  
  81.         g.drawString("" + rands[1], 1615);  
  82.         g.drawString("" + rands[2], 3118);  
  83.         g.drawString("" + rands[3], 4616);  
  84.         // System.out.println(rands);   
  85.     }  
  86.   
  87.     private void drawBackground(Graphics g) {  
  88.         // 画背景   
  89.         g.setColor(new Color(0xDCDCDC));  
  90.         g.fillRect(00, WIDTH, HEIGHT);  
  91.         // 随机产生 120 个干扰点   
  92.         for (int i = 0; i < 120; i++) {  
  93.             int x = (int) (Math.random() * WIDTH);  
  94.             int y = (int) (Math.random() * HEIGHT);  
  95.             int red = (int) (Math.random() * 255);  
  96.             int green = (int) (Math.random() * 255);  
  97.             int blue = (int) (Math.random() * 255);  
  98.             g.setColor(new Color(red, green, blue));  
  99.             g.drawOval(x, y, 10);  
  100.         }  
  101.     }  
  102. }  

最后,是使用验证码的jsp代码,以及JS代码

[html] view plain copy
  1. <label>  
  2.                                                         <span>  
  3.                                                             <span class="lbl input-icon input-icon-right">  
  4.                                                                 <input id="validateCode" name="validateCode" type="text" class="span12" maxlength="15" placeholder="验证码" />  
  5.                                                                 <i class="icon-retweet"></i>  
  6.                                                             </span>  
  7.                                                             <span class="lbl">  
  8.                                                                 <img src="${ctx}/CheckCode" id="yzmPic" onclick="reloadCheckCode()" style="cursor:pointer;" title="点击刷新验证码"/>  
  9.                                                                 <a href="#" onclick="reloadCheckCode()" data-action="reload">  
  10.                                                                     <i class="icon-refresh"></i>  
  11.                                                                 </a>  
  12.                                                             </span>  
  13.                                                         </span>  
  14.                                                     </label>  
js代码如下:

[html] view plain copy
  1. function reloadCheckCode(){  
  2.     document.getElementById("yzmPic").src = $("#ctx").val()+"/CheckCode?r=" + new Date().getTime();  
  3. }  

最后的  r=  new Date().getTime();    相当于,生成一个随机数,避免缓存, 否则,在servlet中,会一直生成同一个验证码(并不是没有生成,而是一直生成同一个。)
[html] view plain copy
  1. <input type="hidden" id="ctx" value="${pageContext.request.contextPath}"/>  
版权声明:Autumn wind with deciduous leaves https://blog.csdn.net/zxf1242652895/article/details/79972479

怎样知道你的程序是运行在安全模式呢?

Use Windows API GetSystemMetrics with SM_CLEANBOOT parameter, this specifies how the system was star...
  • laoli
  • laoli
  • 2001-10-05 14:01:00
  • 868

web登录:随机验证码的设计和实现

本文特点: 针对验证码的生成做了很多算法优化和调整,支持一个典型的验证码生成和验证流程,利用缓存服务器解决聚群部署架构中数据同步的问题。 基本需求: 登录页面显示一个随机验证码图片、有背景干扰...
  • ClementAD
  • ClementAD
  • 2015-09-28 19:35:38
  • 13023

Web登录:随机验证码的设计和实现

转自Clement-Xu的博客:http://blog.csdn.net/clementad/article/details/48788361基本需求:登录页面显示一个随机验证码图片、有背景干扰用户输...
  • Liu_guoer
  • Liu_guoer
  • 2018-02-18 20:56:25
  • 161

android随机生成验证码

Android随机生成验证码,Android利用随机数绘制不规则的验证码,加强用户登录或者注册的安全性。 具体思路如下: 在一块固定宽高的画布上,画上固定个数的随机数字和字母,再画上固定条数的干扰线 ...
  • wk843620202
  • wk843620202
  • 2016-03-23 10:36:05
  • 8834

Android生成随机验证码技术

在Android客户端应用开发中,往往需要短信验证码或者随机验证码来限制用户的操作或者认证。短信验证码是为了对用户进行认证,主要通过Http协议等通信协议实现;随机验证码很大程度是为限制或者提示用户相...
  • u012637501
  • u012637501
  • 2015-06-15 15:52:36
  • 1524

Android中两种方式随机生成验证码源代码

  • 2014年09月24日 22:03
  • 717KB
  • 下载

c#生成随机验证码的源代码(非常简单,注意)

  • 2013年10月10日 20:10
  • 173KB
  • 下载

session实现带随机验证码的登陆

session实现带随机验证码的登陆
  • cckevincyh
  • cckevincyh
  • 2016-09-10 10:23:29
  • 290

网页上随机验证码的生成:

//网页上随机验证码的生成: 可以先随机生成一个在指定范围内的int数字(如果希望生成小写字母,就在97-122之间),然后将其强制转换为char类型,再将多次生成的字符连接起来。//下面程序示范如...
  • zlz18225318697
  • zlz18225318697
  • 2016-09-19 16:38:08
  • 714

一段利用session生成随即验证码得代码分享

import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedIm...
  • daryl715
  • daryl715
  • 2008-04-01 11:17:00
  • 1375
收藏助手
不良信息举报
您举报文章:登录生成随机验证码
举报原因:
原因补充:

(最多只允许输入30个字)