HTML

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <title>验证码</title>
  7. <script type="text/javascript">
  8. function refresh(obj) {
  9. obj.src = "imageServlet?" + Math.random();
  10. }
  11. </script>
  12. </head>
  13. <body>
  14. <form action="checkServlet" method="post">
  15. <label>输入验证码</label><br />
  16. <input type="text" name="randomCode" />
  17. <img title="点击更换" onclick="javascript:refresh(this);" src="data:imageServlet"><br />
  18. <input type="submit" value="提交">
  19. </form>
  20. </body>
  21. </html>

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7. <servlet>
  8. <servlet-name>ImageServlet</servlet-name>
  9. <servlet-class>com.yan.ImageServlet</servlet-class>
  10. </servlet>
  11.  
  12. <servlet-mapping>
  13. <servlet-name>ImageServlet</servlet-name>
  14. <url-pattern>/imageServlet</url-pattern>
  15. </servlet-mapping>
  16. <servlet>
  17. <servlet-name>CheckServlet</servlet-name>
  18. <servlet-class>com.yan.CheckServlet</servlet-class>
  19. </servlet>
  20.  
  21. <servlet-mapping>
  22. <servlet-name>CheckServlet</servlet-name>
  23. <url-pattern>/checkServlet</url-pattern>
  24. </servlet-mapping>
  25. <welcome-file-list>
  26. <welcome-file>index.jsp</welcome-file>
  27. </welcome-file-list>
  28. </web-app>

ImageServlet

  1. package com.yan;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. public class ImageServlet extends HttpServlet{
  11.  
  12. /**
  13. *
  14. */
  15. private static final long serialVersionUID = 1L;
  16. public void doGet(HttpServletRequest request, HttpServletResponse response)
  17. throws ServletException, IOException {
  18.  
  19. response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片
  20. response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
  21. response.setHeader("Cache-Control", "no-cache");
  22. response.setDateHeader("Expire", 0);
  23. RandomValidateCode randomValidateCode = new RandomValidateCode();
  24. try {
  25. randomValidateCode.getRandcode(request, response);//输出图片方法
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. }
  30.  
  31. public void doPost(HttpServletRequest request, HttpServletResponse response)
  32. throws ServletException, IOException {
  33. doGet(request, response);
  34. }
  35. }

RandomValidateCode

  1. package com.yan;
  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.util.Random;
  8.  
  9. import javax.imageio.ImageIO;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import javax.servlet.http.HttpSession;
  13.  
  14. public class RandomValidateCode {
  15. public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key
  16. private Random random = new Random();
  17. private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串
  18.  
  19. private int width = 80;//图片宽
  20. private int height = 26;//图片高
  21. private int lineSize = 40;//干扰线数量
  22. private int stringNum = 4;//随机产生字符数量
  23. /*
  24. * 获得字体
  25. */
  26. private Font getFont(){
  27. return new Font("Fixedsys",Font.CENTER_BASELINE,18);
  28. }
  29. /*
  30. * 获得颜色
  31. */
  32. private Color getRandColor(int fc,int bc){
  33. if(fc > 255)
  34. fc = 255;
  35. if(bc > 255)
  36. bc = 255;
  37. int r = fc + random.nextInt(bc-fc-16);
  38. int g = fc + random.nextInt(bc-fc-14);
  39. int b = fc + random.nextInt(bc-fc-18);
  40. return new Color(r,g,b);
  41. }
  42. /**
  43. * 生成随机图片
  44. */
  45. public void getRandcode(HttpServletRequest request,
  46. HttpServletResponse response) {
  47. HttpSession session = request.getSession();
  48. //BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
  49. BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
  50. Graphics g = image.getGraphics();//产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
  51. g.fillRect(0, 0, width, height);
  52. g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));
  53. g.setColor(getRandColor(110, 133));
  54. //绘制干扰线
  55. for(int i=0;i<=lineSize;i++){
  56. drowLine(g);
  57. }
  58. //绘制随机字符
  59. String randomString = "";
  60. for(int i=1;i<=stringNum;i++){
  61. randomString=drowString(g,randomString,i);
  62. }
  63. session.removeAttribute(RANDOMCODEKEY);
  64. session.setAttribute(RANDOMCODEKEY, randomString);
  65. System.out.println(randomString);
  66. g.dispose();
  67. try {
  68. ImageIO.write(image, "JPEG", response.getOutputStream());//将内存中的图片通过流动形式输出到客户端
  69. } catch (Exception e) {
  70. e.printStackTrace();
  71. }
  72. }
  73. /*
  74. * 绘制字符串
  75. */
  76. private String drowString(Graphics g,String randomString,int i){
  77. g.setFont(getFont());
  78. g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
  79. String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));
  80. randomString +=rand;
  81. g.translate(random.nextInt(3), random.nextInt(3));
  82. g.drawString(rand, 13*i, 16);
  83. return randomString;
  84. }
  85. /*
  86. * 绘制干扰线
  87. */
  88. private void drowLine(Graphics g){
  89. int x = random.nextInt(width);
  90. int y = random.nextInt(height);
  91. int xl = random.nextInt(13);
  92. int yl = random.nextInt(15);
  93. g.drawLine(x, y, x+xl, y+yl);
  94. }
  95. /*
  96. * 获取随机的字符
  97. */
  98. public String getRandomString(int num){
  99. return String.valueOf(randString.charAt(num));
  100. }
  101. }

CheckServlet

  1. package com.yan;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8.  
  9. public class CheckServlet extends HttpServlet{
  10.  
  11. /**
  12. *
  13. */
  14. private static final long serialVersionUID = 1L;
  15. public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException
  16. {
  17. System.out.println("CheckServlet");
  18. String generateCode = (String) request.getSession().getAttribute(RandomValidateCode.RANDOMCODEKEY);
  19. String inputCode = request.getParameter("randomCode");
  20. if (generateCode.equalsIgnoreCase(inputCode)) {
  21. response.getWriter().write("OK!");
  22. }
  23. }
  24. }

参考:

Java生成验证码

Java基础--生成验证码的更多相关文章

  1. java中生成验证码,以及验证码的使用

    java中生成验证码,以及验证码的使用: 1:验证码生成工具类: import java.awt.Color; import java.awt.Font; import java.awt.Graphi ...

  2. 用java Graphics生成验证码

    以下下是API文档对Graphics的介绍! Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制. Graphics 对象封装了 Java ...

  3. java随机生成验证码

    package com.yuyuchen.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; im ...

  4. java动态生成验证码图片

    package cn.lijun.checkimg; import java.awt.image.BufferedImage;import java.io.BufferedReader; import ...

  5. Java生成验证码原理(jsp)

     验证码的作用: 验证码是Completely Automated Public Turing test to tell Computers and Humans Apart(全自动区分计算机和人类的 ...

  6. java生成验证码结合springMVC

    在用户登录的时候,为了防止机器人攻击都会设置输入验证码,本篇文章就是介绍java如何生成验证码并使用在springMVC项目中的. 第一步:引入生成图片验证码的工具类 import java.awt. ...

  7. 如何利用随机数产生验证码(java基础知识)

    以前我们通用的验证码都是五个不同的大小写字母,那么今天我就带大家学习一下利用Java基础怎么生成验证码.首先我们应该有一个清晰的思路:首先定义一个固定长度的数组用来存储需要生成的字母:其次生成随机数, ...

  8. JAVA整合kaptcha生成验证码 (字母验证码和算术验证码)

    引入maven <!--图片验证码--> <dependency> <groupId>com.github.penggle</groupId> < ...

  9. java web学习总结(九) -------------------通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

随机推荐

  1. C语言:冒泡排序法:将若干字符串按字母顺序(由小到大)排序输出

    #include<stdio.h> #include<string.h> void sort(char *a[]); void print(char *a[]); int ma ...

  2. Maven 在eclipse中如何配置

    大部分码农们都很熟悉Eclipse,用eclipse开发项目,Maven是解决依赖库的一个非常好用的java工具,可以与Eclipse集成,方便地管理web,java项目等等:但是很多初学者都不知道怎 ...

  3. python学习之base64模块

    常见方法: base64.encodebytes() 参数: 接收一个字节对象. 返回值: 返回base64编码的数据(以'\n'结尾的数据). base64.decodebytes() 参数: 接收 ...

  4. error LNK2019: 无法解析的外部符号(编程解决方法)

    正在编译...1>Ipv4IPv6traceroutesrc.cpp1>d:\研究生\c++\study\test\test\ipv4ipv6traceroutesrc.cpp(461) ...

  5. zend studio 安装后一体化配置

    1.安装语言包http://www.eclipse.org/babel/downloads.php 11.0的时候仍然是junohttp://download.eclipse.org/technolo ...

  6. form表单提交数据编码方式和tomcat接受数据解码方式的思考

    http://blog.sina.com.cn/s/blog_95c8f1ac010198j2.html *********************************************** ...

  7. django 线上线下使用不同的数据库 上线:mysql 线下sqlite3 以及debug模式的开和关

    hostname = socket.gethostname() 获取主机名称 import os import socket hostname = socket.gethostname() if ho ...

  8. DOS下运行C++程序配置

    闲来无事,想想C++是否一样能用dos来,编译运行程序呢,于是上网搜搜结果喜人,详见 http://blog.csdn.net/xiaoqinpeng/article/details/6556843 ...

  9. Hadoop的集群和优化

    Hadoop的集群和优化 Hadoop集群规模小到几个节点就可以组件一个集群,大到由几千个节点组成的超大集群. 在安装Hadoop集群时,把要安装的软件解压到集群内的所有机器上,软件的安装目录也要一致 ...

  10. Cocos2d-x 3.0final 终结者系列教程06-Director和场景跳转

    这些天互联网大事不少呀 1.逻辑思维分家(所谓合久必分,分久必合,实属正常.切行切珍惜吧) 2. 锤子手机开卖  (无论你买没买,反正我没买,作为多年Android开发的我深知说的亮点事实上在我看来都 ...