文档章节

JAVA生成网页图片验证码

cnzxzc
 cnzxzc
发布于 2016/04/12 01:59
字数 737
阅读 191
收藏 1

网页验证码总所周知,前言略,看效果图 

用最简单的话,完成最快的工作

1. 生成验证码图片的类

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * author : cnzxzc
 */
public class RandomValidateCode {
    private Random random = new Random();
    private int width = 80;//图片宽
    private int height = 26;//图片高
    private int lineNum = 5;//干扰线数量
    private int pointNum = 30;//噪点数量
    private int stringNum = 4;//随机产生字符数量
    private Font font = new Font("Times New Roman", Font.ROMAN_BASELINE, 18);
    private char[] index = {'a','A','0'};//验证码索引
    /**
     * 生成验证码字符串
     */
    private char[] getValidateString(){
        char[] c = new char[stringNum];
        for(int i = 0; i<stringNum; i++) {
            int offset = random.nextInt(3);
            switch (offset) {
                case 0:
                case 1:
                    c[i] = (char) ((int) index[offset] + random.nextInt(26));
                    break;
                case 2:
                    c[i] = (char) ((int) index[offset] + random.nextInt(10));
                    break;
            }
        }
        return c;
    }
    /**
     * 生成图片
     * */
    public void makeValidateImage(HttpServletRequest request, HttpServletResponse response){
        //验证码
        char[] text = getValidateString();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        g.setFont(font);
        g.setColor(Color.GREEN);
        g.drawRect(0, 0, width, height);
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);
        //绘制干扰线
        drowLine(g);
        //绘制噪点
        drowPoint(g);
        //绘制随机字符
        drowString(g, text);
        try {
            request.getSession().setAttribute("validateCode", new String(text));
            ImageIO.write(image, "JPEG",  response.getOutputStream());
        } catch (Exception e){
            e.printStackTrace();
        }finally {
            g.dispose();
        }
    }
    /**
     * 绘制字符串
     * */
    private void drowString(Graphics g, char[] text){
        g.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121)));
        int x = random.nextInt(width);
        int y = random.nextInt(height);
        //防止画图画出范围
        while(x>25){ x -= 20; }
        while(y<13){ y += 10; }
        g.drawChars(text, 0, stringNum, x, y);
    }
    /**
     * 绘制干扰线
     */
    private void drowLine(Graphics g){
        for(int i = 0; i < lineNum; i++) {
            g.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121)));
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(height);
            int x2 = random.nextInt(width);
            int y2 = random.nextInt(height);
            g.drawLine(x1, y1, x2, y2);
        }
    }
    /**
     * 绘制噪声点
     */
    private void drowPoint(Graphics g){
        for(int i = 0; i < pointNum; i++) {
            g.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121)));
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            g.drawLine(x, y, x, y);
        }
    }
}

 

2. Servlet文件有两个,一个用于启动,一个用于ajax校验

要是用struts或者Spring就不用两个文件这么麻烦了

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "ValidateServlet", urlPatterns = "/ValidateServlet")
public class ValidateServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        RandomValidateCode r = new RandomValidateCode();
        r.makeValidateImage(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
@WebServlet(name = "CheckServlet", urlPatterns = "/CheckServlet")
public class CheckServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String validateCode = (String) (request.getSession().getAttribute("validateCode"));
        response.getWriter().write(validateCode);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

 

3. 页面代码( jsp )

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>sy6</title>
  <script type="text/javascript" src="http://static.blog.csdn.net/scripts/jquery.js"></script>
  <script type="text/javascript">
    function check(code){
      $.ajax({
        type:"post",
        url:"${pageContext.request.contextPath}/CheckServlet",
        data: "code=" + code,
        success:function(data){
          if(data!=code) {
            document.getElementById("mes").innerHTML = "<p style='color: red;'>×</p>";
          } else document.getElementById("mes").innerHTML = "<p style='color: GREEN;'>√</p>";
        }
      });
    }
  </script>
  <style type="text/css">
    #main{
      width:540px;
      padding:10px;
      margin:250px auto;
      text-align:center;
      border-radius:5px;
      box-shadow:-2px 0 10px #ccc,2px 0 10px #ccc;
    }
    #main button{
      width: 70px;
      height: 50px;
      font-size: 16px;
      color: white;
      background-color: dodgerblue;
      border: none;
      border-radius: 10px;
      box-shadow:-2px 0 10px #ccc,2px 0 10px #ccc;
    }
  </style>
</head>
<body>
<div id="main">

  <form action="${pageContext.request.contextPath}/ForwardServlet" id="form">
    <label id="validate">输入验证码:</label>
    <input type="text" name="key" onchange="check(this.value)" style="width: 70px">
    <img src="${pageContext.request.contextPath}/ValidateServlet"><lable id="mes"></lable><br>
    <input type="submit">
  </form>
</div>
</body>
</html>

 

© 著作权归作者所有

cnzxzc
粉丝 0
博文 5
码字总数 2839
作品 0
广州
程序员
私信 提问
Python如何编写爬虫程序,附高级爬虫实现思路

今天和大家一起用Python写一个入门爬虫,作为基础课程的最后一讲。也希望给那些学习Python很久却没有思路,不知道如何实现一个爬虫的同学带带节奏,本节课会通过最简单的方式,实现抓取远程网...

程序员补给栈
01/29
58
0
java web验证码生成总结(包括servlet、jsp和struts2实现)(转)

一、使用纯Servlet实现验证码 (1)在web.xml配置: [java] view plaincopy <servlet> <servlet-name>image</servlet-name> <servlet-class>org.test.web.AuthImage</servlet-class> </servlet>......

Famp
2014/07/10
255
0
从.Net到Java学习第十一篇——SpringBoot登录实现

通过前面10篇文章的学习,相信我们对SpringBoot已经有了一些了解,那么如何来验证我们的学习成果呢?当然是通过做项目来证明吧!所以从这一篇开始我将会对之前自己做的.net项目用java来重写。...

邹琼俊
2018/07/13
0
0
Spring Security之用户名+密码登录

自定义用户认证逻辑 处理用户信息获取逻辑 实现UserDetailsService接口 处理用户校验逻辑 UserDetails接口的一些方法,封装了登录时的一些信息 返回数据写成 处理密码加密解密 PasswordEnco...

yysue
2018/10/11
546
0
精通Spring Boot——第十九篇:Spring Security 整合验证码登录

献上一句格言,来自马克·扎克伯格的座右铭: Stay foucsed, Keep shipping(保持专注,持续交付) 1.引言 回到本章节我们将要学习的内容,现在使用验证码登录方式是再常见不过了,图形验证码,...

liu浪诗人
02/06
106
0

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
今天
10
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
23
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
9
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部