`
mimang2007110
  • 浏览: 233021 次
  • 性别: 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>

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics