怎么用servlet来解决验证码问题

来源:互联网 发布:人工智能聊天机器人 编辑:程序博客网 时间:2024/05/11 19:07

 现在做网站有许多都是用php或者asp,但是有其他的网站是用java来做的,准确点说是jsp,这种网站得益于java的优点,会带来不小的好处,那么我们应该要怎么用java的方式来解决验证码问题下,下面是一个servlet解决验证码的代码段,希望对大家有帮助。

 

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.awt.*;

import java.awt.image.*;

import java.util.*;

import javax.imageio.*;

 

/**

 * @author  yeeku.H.lee kongyeeku@163.com

 * @version  1.0

 * <br>Copyright (C), 2005-2008, yeeku.H.Lee

 * <br>This program is protected by copyright laws.

 * <br>Program Name:

 * <br>Date:

 */

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);

  }

    }

}

 其中这是加了干扰线的了,并且用session来保存验证码了,

在登陆的jsp页面中,应该这样设置

 验证码如图:<img src="authImg" id="authImg"/>看不清?<a href="#" onClick="refresh()">单击此处刷新</a>

然后refesh()函数如下写

<script>

   function refresh()

   {

    document.getElementById("authImg").src=‘authImg?now=‘ + new Date();

   }

  </script>

之所以在最后加now,是防止浏览器的缓存

 

最后再在web.xml里配置下servlet

 

 

 <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>

 

其实用什么语言来做验证码都几乎相同,里面的思想都是相近的,只不过就是语法细节不一样罢了,看了上面的代码,所有用过JSP的人都可以扩展它做出更好的东西,如果想要更好的代码,那就常来知码网吧,这里有许多更好的文章。