`
mimang2007110
  • 浏览: 237380 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

java 图片验证码的实现【转】

阅读更多
第一步:编写一个产生验证码的Servlet (验证码为全数字)

package org.yeeku.web;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

public class AuthImg extends HttpServlet {

 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

        response.setContentType("image/jpeg");

        response.setHeader("Pragma","No-cache");

        response.setHeader("Cache-Control","no-cache");

        response.setDateHeader("Expires", 0);      
        HttpSession session=request.getSession();

        // 在内存中创建图象

        int width=60, height=20;

        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        // 获取图形上下文

        Graphics g = image.getGraphics();

        //生成随机类

        Random random = new Random();

        // 设定背景色

        g.setColor(getRandColor(200,250));

        g.fillRect(0, 0, width, height);

        //设定字体

        g.setFont(new Font("Times New Roman",Font.PLAIN,18));

        //画边框

        //g.setColor(new Color());

        //g.drawRect(0,0,width-1,height-1);

        // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到

        g.setColor(getRandColor(160,200));

        for (int i=0;i<155;i++) {

            int x = random.nextInt(width);

            int y = random.nextInt(height);

            int xl = random.nextInt(12);

            int yl = random.nextInt(12);

            g.drawLine(x,y,x+xl,y+yl);

        }

        // 取随机产生的认证码(4位数字)

        String sRand="";

        for (int i=0;i<6;i++){

            String rand=String.valueOf(random.nextInt(10));

            sRand+=rand;

            // 将认证码显示到图象中

            g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成

            g.drawString(rand,13*i+6,16);

        }

        // 将认证码存入SESSION

        session.setAttribute("rand",sRand);

        // 图象生效

        g.dispose();

        ServletOutputStream responseOutputStream =response.getOutputStream();

        // 输出图象到页面

        ImageIO.write(image, "JPEG", responseOutputStream);

        //以下关闭输入流!

        responseOutputStream.flush();

        responseOutputStream.close();

    }

    Color getRandColor(int fc,int bc){//给定范围获得随机颜色

        Random random = new Random();

        if(fc>255) fc=255;

        if(bc>255) bc=255;

        int r=fc+random.nextInt(bc-fc);

        int g=fc+random.nextInt(bc-fc);

        int b=fc+random.nextInt(bc-fc);

        return new Color(r,g,b);

    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">

   
    protected void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

        processRequest(request, response);

    }

   
    protected void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

        processRequest(request, response);

    }

   
    public String getServletInfo() {

        return "Short description";

    }

    // </editor-fold>

}

 
//产生的验证码有字母的Servlet

public class AuthImg extends HttpServlet

{

    private Font mFont = new Font("Arial Black", Font.PLAIN, 16);

    public void init() throws ServletException

    {

        super.init();

    }

    Color getRandColor(int fc,int bc)

    {

        Random random = new Random();

        if(fc>255) fc=255;

        if(bc>255) bc=255;

        int r=fc+random.nextInt(bc-fc);

        int g=fc+random.nextInt(bc-fc);

        int b=fc+random.nextInt(bc-fc);

        return new Color(r,g,b);

    }

    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

    {

        response.setHeader("Pragma","No-cache");

        response.setHeader("Cache-Control","no-cache");

        response.setDateHeader("Expires", 0);

        response.setContentType("image/jpeg");

       
        int width=100, height=18;

        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

       
        Graphics g = image.getGraphics();

        Random random = new Random();

        g.setColor(getRandColor(200,250));

        g.fillRect(1, 1, width-1, height-1);

        g.setColor(new Color(102,102,102));

        g.drawRect(0, 0, width-1, height-1);

        g.setFont(mFont);

        g.setColor(getRandColor(160,200));

        for (int i=0;i<155;i++)

        {

            int x = random.nextInt(width - 1);

            int y = random.nextInt(height - 1);

            int xl = random.nextInt(6) + 1;

            int yl = random.nextInt(12) + 1;

            g.drawLine(x,y,x + xl,y + yl);

        }

        for (int i = 0;i < 70;i++)

        {

            int x = random.nextInt(width - 1);

            int y = random.nextInt(height - 1);

            int xl = random.nextInt(12) + 1;

            int yl = random.nextInt(6) + 1;

            g.drawLine(x,y,x - xl,y - yl);

        }

        String sRand="";

        for (int i=0;i<6;i++)

        {

   String tmp = getRandomChar();

            sRand += tmp;

            g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));

         g.drawString(tmp,15*i+10,15);

        }

        HttpSession session = request.getSession(true);

        session.setAttribute("rand",sRand);

        g.dispose();

        ImageIO.write(image, "JPEG", response.getOutputStream());

    }

    private String getRandomChar()

    {

  int rand = (int)Math.round(Math.random() * 2);

  long itmp = 0;

  char ctmp = '\u0000';

  switch (rand)

  {

   case 1:

    itmp = Math.round(Math.random() * 25 + 65);

    ctmp = (char)itmp;

    return String.valueOf(ctmp);

   case 2:

    itmp = Math.round(Math.random() * 25 + 97);

    ctmp = (char)itmp;

    return String.valueOf(ctmp);

   default :

    itmp = Math.round(Math.random() * 9);

    return String.valueOf(itmp);

  }

    }

 
第二步,在工程中的web.xml中配置上面的servlet

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"

 xmlns="http://java.sun.com/xml/ns/j2ee"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

   <servlet>

        <servlet-name>img</servlet-name>

        <servlet-class>org.yeeku.web.AuthImg</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>img</servlet-name>

     <url-pattern>/authImg</url-pattern>

    </servlet-mapping>

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

</web-app>

第三步,编写验证码显示的jsp页面:

<%@ page contentType="text/html;charset=gb2312"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

 <head>

  <title>认证码输入页面</title>

  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">

  <META HTTP-EQUIV="Pragma" CONTENT="no-cache">

  <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">

  <META HTTP-EQUIV="Expires" CONTENT="0">

  <script language="JavaScript">

          function myrefresh()

          {

            window.location.reload();

          }

</script>

 </head>

 <body>

  <form method=post action="check.jsp">

   <table>

    <tr>

     <td align=left>

      系统产生的认证码:

     </td>

     <td>

      <img border=0 src="authImg">  <input type="button" value="看不清,在换一张" onclick="myrefresh()">

     </td>

    </tr>

    <tr>

     <td align=left>

      输入上面的认证码:

     </td>

     <td>

      <input type=text name=rand maxlength=4 value="">

     </td>

    </tr>

    <tr>

     <td colspan=2 align=center>

      <input type=submit value="提交检测">

     </td>

    </tr>

    </table>

   </form>

 </body>

第四步,编写jsp测试验证码

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<html>

<head>

<title>认证码验证页面</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">

<META HTTP-EQUIV="Expires" CONTENT="0">

</head>

<body>

<%

String rand = (String)session.getAttribute("rand");

String input = request.getParameter("rand");

%>

系统产生的认证码为: <%= rand %><br>

您输入的认证码为: <%= input %><br>

<br>

<%

  if (rand.equals(input)) {

%>

<font color=green>输入相同,认证成功!</font>

<%

  } else {

%>

<font color=red>输入不同,认证失败!</font>

<%

  }

%>

</body>

</html>

 

分享到:
评论

相关推荐

    java实现滑动验证码

    java实现滑动验证码

    JAVA实现随机图片验证码简单方法

    JAVA实现随机图片验证码简单方法.rtf

    Java实现点击文字验证码与拖动/滑动图片验证码(源码+demo+单元测试+实现思路)

    1.部署步骤 1.1 100%可生产使用. 1.2 导入到idea时候选择maven项目 1.3 修改demo里面子项目resources/application.yml的redis... 4.2拖动图片验证码:https://blog.csdn.net/m0_38138879/article/details/117559456

    java-验证码识别-验证码破解

    Java作为广泛应用的编程语言,也提供了多种方法来实现验证码识别。在这个“java-验证码识别-验证码破解”的主题中,我们将深入探讨如何使用Java进行验证码识别,特别是通过Tess4J库进行OCR(光学字符识别)。 ...

    Java实现的图片验证码

    在本文中,我们将深入探讨如何使用Java语言来实现一个图片验证码的系统。Java因其丰富的库和强大的面向对象特性,成为开发验证码的理想选择。 验证码的核心功能包括生成随机字符串、将字符串转化为图像以及提供用户...

    Java图片验证码工具类

    2. **Java图片验证码实现**: 在Java中,我们可以使用`java.awt`和`javax.imageio`库来创建和处理图片。首先,创建一个新的空白图片,然后在图片上绘制随机颜色和形状的干扰线,最后在合适的位置上绘制随机生成的...

    java识别图片验证码的2种方式

    包含5个识别图片验证码的类,分别对应不同5种不同的验证码 其中用了两种不同的实现方式(截取采样像素比对+Tesseract-OCR识别) 附带一个图像指纹类(判定图片相似度)和一个寻找联通线的类(八皇后算法实现)

    java-图片验证码.zip

    这个"java-图片验证码.zip"压缩包包含了一个实现Java图片验证码功能的工具类(VerifyUtil.java)和一个具体的控制器(AppPicCodeController.java),用于处理验证码的生成与验证。 首先,我们来详细了解一下`...

    java生成图片验证码

    描述中同样强调了"java生成图片验证码",这意味着我们将专注于Java实现的具体步骤和技术。 标签"java servlet"表明我们将在Servlet环境下进行操作。Servlet是Java EE(现在称为Jakarta EE)的一部分,主要用于开发...

    java图片验证码源码

    验证码(Vercode)是网络应用中常用的一种...总的来说,创建Java图片验证码涉及多个技术点,包括字符串生成、图像处理、随机数生成等。通过理解并实践这些技术,开发者可以创建出适合自己应用的高效安全的验证码系统。

    java图片验证码

    ### Java 图片验证码实现原理与代码解析 #### 一、概述 在许多网站或应用程序中,为了防止机器人的恶意操作,经常会使用到图形验证码。Java 图片验证码是一种常见的实现方式,它通过生成具有一定随机性的图像,并...

    java实现拖拉验证码工具类

    实现功能:传入路径,返回base64图片编码(原图抠图及滑块图)、图片坐标值、唯一id; 使用方法:1、将jar包导入项目中; 2、调用工具类 ImageVo imageVo = GraphicCodeUtil.generate("E:\\data\\3322.jpg",width,...

    java 生成图片验证码

    在IT领域,验证码(CAPTCHA)是一...在提供的压缩包文件“图片验证码生成”中,可能包含了实现上述功能的源代码示例,你可以通过学习和理解这些代码,加深对Java生成图片验证码的理解,并根据实际需求进行调整和优化。

    java-滑动验证码实现

    springboot框架实现滑动验证码,下载后可直接运行,http://localhost:8899/index.html启动后直接访问验证,工具方法可以直接拿出使用与自身项目代码结合使用,本人前端能力有限,只实现基本的滑动验证,关于其他效果...

    验证码破解的方法,简单验证码破解java示例

    本篇文章将详细讨论验证码的基本原理,以及如何使用Java实现简单的验证码破解方法。请注意,了解验证码破解知识主要是为了提高网站安全意识,避免自身系统被攻击,而不是用于恶意破解他人系统。 验证码的类型主要有...

    JAVA识别验证码,支持变形,扭曲,斜线,噪点,支持自己训练

    在JAVA平台上,我们可以利用OCR(Optical Character Recognition,光学字符识别)技术来实现对各种复杂验证码的识别,包括变形、扭曲、斜线干扰以及含有噪点的验证码。本项目的核心就是通过JAVA实现一个强大的OCR...

    java图片滑动验证码

    Java图片滑动验证码是一种常见的网页安全机制,用于防止自动化脚本或机器人进行恶意操作,如批量注册、频繁登录等。这种验证码通常由两张图片拼接而成,用户需要通过拖动滑块将一部分图片正确地拼接到另一部分上,...

    JAVA和HTML5实现的多种验证码实现

    在学习这些验证码实现时,你可以通过查看压缩包中的"validateCode"源码文件来深入了解每个验证码的具体实现细节。同时,"截图"可能包含各个验证码的示例图像,帮助理解其外观和工作原理。此外,"关注科帮网获取更多...

    java 生成动态gif 验证码

    在Java开发中,生成动态GIF验证码是一种常见的安全机制,用于防止自动机器人...通过以上步骤,你就可以在Java Web应用中实现一个生成动态GIF验证码的功能。这不仅增强了系统的安全性,也为用户提供了良好的交互体验。

Global site tag (gtag.js) - Google Analytics