伽然官网|AnyForWeb官网|CtrlCRM官网 博客分享:WEB技术|WEB前端|WEB视觉

用Java生成中文验证

2014-07-07浏览:
标签Java

要在Java Web中生成中文的有关验证码,首先应该随机拿到几个汉字,然后将获取到的汉字利用Graphics画在图片上面,具体的实现代码如下:

 

package com.bkybk.tools;

 

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.geom.AffineTransform;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.io.OutputStream;

importjava.io.UnsupportedEncodingException;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

 

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

public class CheckcodeServlet extendsHttpServlet {

 

   private static final long serialVersionUID = 1L;

 

   /**

    *

    * 旋转和缩放文字

    *

    * 必须要使用Graphics2d

    */

 

   public void service(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {

         //生成一个消息头(content-type,告诉客户端(浏览器),返回的数据类型。

         response.setContentType("text/html;charset=gbk");

         Randomr = new Random();

         StringstrSession = "";

         //第一步:生成一张图片

         intwidth = 88;

         intheight = 22;

         //创建一个内存映像对象

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

         //获得画笔

         Graphicsg = image.getGraphics();

         //给笔上颜色(随机的一个颜色),设置背景颜色

         g.setColor(newColor(255,255,255));

         //设置画布的大小

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

         //设置显示字体的样式大小

         g.setFont(newFont("宋体", Font.PLAIN, 17));

         //设置绘画位置

         intstartSize = 5;               

         List<String>list = create();

         //获得随机文字

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

                   //      开始绘图

                   g.setColor(newColor(r.nextInt(200), r.nextInt(200), r.nextInt(200)));

                   g.drawString(list.get(i),startSize, 18);

                   startSize+= 20;

                   strSession+= list.get(i);

         }

         HttpSessionsession = request.getSession();

         //将随机文字绑订到session对象上

         session.setAttribute("checkCode",strSession);

         //第二步,将图片压缩,并输出到时客户端

 

         //设置正确的消息头,告诉浏览器返回的是图片

         response.setContentType("image/jpeg");

         //获得一个字节输出流

         OutputStreamops = response.getOutputStream();

         //压缩并输出

         javax.imageio.ImageIO.write(image,"jpeg", ops);

    }

 

   /**

    *

    * 原理是从汉字区位码找到汉字。在汉字区位码中分

         高位与底位, 且其中简体又有繁体。位数越前生

         成的汉字繁体的机率越大。

    *

    * 所以在本例中高位从171取,底位从161取,去掉大部

         分的繁体和生僻字。但仍然会有!!

    *

    *

    */

   public static List<String> create() {

         List<String>strList = new ArrayList<String>();

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

                   try{

                            //定义高低位

                            inthightPos, lowPos;

                            Randomrandom = new Random();

                            //获取高位值

                            hightPos= (176 + Math.abs(random.nextInt(39)));

                            //获取低位值

                            lowPos= (161 + Math.abs(random.nextInt(93)));

                            byte[]b = new byte[2];

                            b[0]= (new Integer(hightPos).byteValue());

                            b[1]= (new Integer(lowPos).byteValue());

                            Stringstr = new String(b, "GBK");

                            strList.add(str);

                   }catch (UnsupportedEncodingException e) {

                            e.printStackTrace();

                   }

         }

         returnstrList;

    }

 

}

 

本文为Anyforweb技术分享博客,需要了解网站建设及更多web应用相关信息,请访问anyforweb.com



标签



订阅

欢迎订阅《AnyForWeb 程序开发》
博客


热门文章



AnyForWeb 内部博客分享

版权所有 © 2000- AnyForWeb

Oh~What’s up?

您当前访问的网站已关闭!

如需了解Web行业资讯,请进入:

如需了解Web行业资讯,请进入:伽然书院