java Web生成验证码

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 = '\';


  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="看不清,在换一张" οnclick="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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值