100分求登录页面的随机验证码源程序。 就是csdn登录页面那种图像验证码。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 <%@ page contentType="image/jpeg" import="java.awt.*, java.awt.image.*,java.util.*,javax.imageio.*" %> <% // 在内存中创建图象 int width=60, height=20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics g = image.getGraphics(); // 设定背景色 g.setColor(new Color(0xDCDCDC)); g.fillRect(0, 0, width, height); //画边框 g.setColor(Color.black); g.drawRect(0,0,width-1,height-1); // 取随机产生的认证码(4位数字) String rand = request.getParameter("rand"); rand = rand.substring(0,rand.indexOf(".")); switch(rand.length()) { case 1: rand = "000"+rand; break; case 2: rand = "00"+rand; break; case 3: rand = "0"+rand; break; default: rand = rand.substring(0,4); break; } // 将认证码存入SESSION session.setAttribute("rand",rand); // 将认证码显示到图象中 g.se tColor(Color.black); Integer tempNumber = new Integer(rand); String numberStr = tempNumber.toString(); g.setFont(new Font("Atlantic Inline",Font.PLAIN,18)); String Str = numberStr.substring(0,1); g.drawString(Str,8,17); Str = numberStr.substring(1,2); g.drawString(Str,20,15); Str = numberStr.substring(2,3); g.drawString(Str,35,18); Str = numberStr.substring(3,4); g.drawString(Str,45,15); // 随机产生88个干扰点,使图象中的认证码不易被其它程序探测到 Random random = new Random(); for (int i=0;i<20;i++) { int x = random.nextInt(width); int y = random.nextInt(height); g.drawOval(x,y,0,0); } // 图象生效 g.dispose(); // 输出图象到页面 ImageIO.write(image, "JPEG", response.getOutputStream()); %> 我现在用的package org.javawind.servlet;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.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; public class SysCode extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { private static final long serialVersionUID = -5981700888850353189L; public SysCode() { super(); } @SuppressWarnings("static-access") protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("image/jpeg"); //必须设置ContentType为image/jpeg response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires",0); //设置图片的长宽 验证码长度 int width=60, height=20,len=4; String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; int length = base.length(); //创建内存图像 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //获取图形上下文 Graphics g = image.getGraphics(); //创建随机类的实例 Random random = new Random(); //设定图像背景色(因为是做背景,所以偏淡) g.setColor(getRandColor(random,200,250)); g.fillRect(0, 0, width, height); //备选字体 String[] fontTypes = {"tahoma","Atlantic Inline","fantasy","Times New Roman","Georgia","Arial", "Helvetica", "sans-serif","System"}; int fontTypesLength = fontTypes.length; //在图片背景上增加噪点 g.setColor(getRandColor(random,160,200)); g.setFont(new Font("Times New Roman",Font.PLAIN,12)); for (int i=0;i<6;i++) { g.drawString("!@#$%^,.;'[javawind.net]/<&*()>:5277",0,5*(i+2)); } String sRand="",pStr=""; for (int i=0;i<len;i++) { int start = random.nextInt(length); String rand=base.substring(start,start+1); sRand+=rand; //设置字体的颜色 g.setColor(getRandColor(random,10,150)); //设置字体 g.setFont(new Font(fontTypes[random.nextInt(fontTypesLength)],Font.BOLD,16)); //将随机验证码画到图片上 //g.drawString(rand,15*i,18); pStr = sRand.substring(i,i+1); if(i==0){ g.drawString(pStr,2,14); } if(i==1){ g.drawString(pStr,15,16); } if(i==2){ g.drawString(pStr,30,15); } if(i==3){ g.drawString(pStr,45,13); } } //将认证码存入session request.getSession().setAttribute("SystemCode",sRand); g.dispose(); //输出图象到页面 ImageIO.write(image,"JPEG",response.getOutputStream()); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } protected Color getRandColor(Random random,int fc,int bc) { 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); }} 用Awt,参照这http://blog.csdn.net/iqyeah/archive/2006/11/03/1364538.aspx <%@page contentType="image/jpeg" pageEncoding="UTF-8" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%><%!//生成随机颜色Color getRandColor(Random random, int fc, int bc) {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);}%><%//设置页面不缓存response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);// 设置图片的长宽int width = 176, height = 30;//设置备选汉字,剔除一些不雅的汉字String base = "u7684u4e00u4e86u662fu6211u4e0du5728u4ebau4eecu6709u6765u4ed6u8fd9u4e0au7740u4e2au5730u5230u5927u91ccu8bf4u5c31u53bbu5b50u5f97u4e5fu548cu90a3u8981u4e0bu770bu5929u65f6u8fc7u51fau5c0fu4e48u8d77u4f60u90fdu628au597du8fd8u591au6ca1u4e3au53c8u53efu5bb6u5b66u53eau4ee5u4e3bu4f1au6837u5e74u60f3u751fu540cu8001u4e2du5341u4eceu81eau9762u524du5934u9053u5b83u540eu7136u8d70u5f88u50cfu89c1u4e24u7528u5979u56fdu52a8u8fdbu6210u56deu4ec0u8fb9u4f5cu5bf9u5f00u800cu5df1u4e9bu73b0u5c71u6c11u5019u7ecfu53d1u5de5u5411u4e8bu547du7ed9u957fu6c34u51e0u4e49u4e09u58f0u4e8eu9ad8u624bu77e5u7406u773cu5fd7u70b9u5fc3u6218u4e8cu95eeu4f46u8eabu65b9u5b9eu5403u505au53ebu5f53u4f4fu542cu9769u6253u5462u771fu5168u624du56dbu5df2u6240u654cu4e4bu6700u5149u4ea7u60c5u8defu5206u603bu6761u767du8bddu4e1cu5e2du6b21u4eb2u5982u88abu82b1u53e3u653eu513fu5e38u6c14u4e94u7b2cu4f7fu5199u519bu5427u6587u8fd0u518du679cu600eu5b9au8bb8u5febu660eu884cu56e0u522bu98deu5916u6811u7269u6d3bu90e8u95e8u65e0u5f80u8239u671bu65b0u5e26u961fu5148u529bu5b8cu5374u7ad9u4ee3u5458u673au66f4u4e5du60a8u6bcfu98ceu7ea7u8ddfu7b11u554au5b69u4e07u5c11u76f4u610fu591cu6bd4u9636u8fdeu8f66u91cdu4fbfu6597u9a6cu54eau5316u592au6307u53d8u793eu4f3cu58ebu8005u5e72u77f3u6ee1u65e5u51b3u767eu539fu62ffu7fa4u7a76u5404u516du672cu601du89e3u7acbu6cb3u6751u516bu96beu65e9u8bbau5417u6839u5171u8ba9u76f8u7814u4ecau5176u4e66u5750u63a5u5e94u5173u4fe1u89c9u6b65u53cdu5904u8bb0u5c06u5343u627eu4e89u9886u6216u5e08u7ed3u5757u8dd1u8c01u8349u8d8au5b57u52a0u811au7d27u7231u7b49u4e60u9635u6015u6708u9752u534au706bu6cd5u9898u5efau8d76u4f4du5531u6d77u4e03u5973u4efbu4ef6u611fu51c6u5f20u56e2u5c4bu79bbu8272u8138u7247u79d1u5012u775bu5229u4e16u521au4e14u7531u9001u5207u661fu5bfcu665au8868u591fu6574u8ba4u54cdu96eau6d41u672au573au8be5u5e76u5e95u6df1u523bu5e73u4f1fu5fd9u63d0u786eu8fd1u4eaeu8f7bu8bb2u519cu53e4u9ed1u544au754cu62c9u540du5440u571fu6e05u9633u7167u529eu53f2u6539u5386u8f6cu753bu9020u5634u6b64u6cbbu5317u5fc5u670du96e8u7a7fu5185u8bc6u9a8cu4f20u4e1au83dcu722cu7761u5174u5f62u91cfu54b1u89c2u82e6u4f53u4f17u901au51b2u5408u7834u53cbu5ea6u672fu996du516cu65c1u623fu6781u5357u67aau8bfbu6c99u5c81u7ebfu91ceu575au7a7au6536u7b97u81f3u653fu57ceu52b3u843du94b1u7279u56f4u5f1fu80dcu6559u70edu5c55u5305u6b4cu7c7bu6e10u5f3au6570u4e61u547cu6027u97f3u7b54u54e5u9645u65e7u795eu5ea7u7ae0u5e2eu5566u53d7u7cfbu4ee4u8df3u975eu4f55u725bu53d6u5165u5cb8u6562u6389u5ffdu79cdu88c5u9876u6025u6797u505cu606fu53e5u533au8863u822cu62a5u53f6u538bu6162u53d4u80ccu7ec6";//备选汉字的长度int length = base.length();//创建内存图像BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 获取图形上下文Graphics g = image.getGraphics();//创建随机类的实例Random random = new Random();// 设定图像背景色(因为是做背景,所以偏淡)g.setColor(getRandColor(random, 200, 250));g.fillRect(0, 0, width, height);//备选字体String[] fontTypes = {"u5b8bu4f53", "u65b0u5b8bu4f53", "u9ed1u4f53", "u6977u4f53", "u96b6u4e66"};int fontTypesLength = fontTypes.length;//在图片背景上增加噪点g.setColor(getRandColor(random, 160, 200));g.setFont(new Font("Times New Roman", Font.PLAIN, 14));for (int i = 0; i < 6; i++) {g.drawString("*********************************************", 0, 5 * (i + 2));}//取随机产生的认证码(6个汉字)//保存生成的汉字字符串String sRand = "";for (int i = 0; i < 6; i++) {int start = random.nextInt(length);String rand = base.substring(start, start + 1);sRand += rand;//设置字体的颜色g.setColor(getRandColor(random, 10, 150));//设置字体g.setFont(new Font(fontTypes[random.nextInt(fontTypesLength)], Font.BOLD, 18 + random.nextInt(6)));//将此汉字画到图片上g.drawString(rand, 24 * i + 10 + random.nextInt(8), 24);}//将认证码存入sessionsession.setAttribute("rand", sRand);g.dispose();//输出图象到页面ImageIO.write(image, "JPEG", response.getOutputStream());%> 在这里看一下,使用的是servlet来实现随机验证码的实现http://www.dwww.cn/News/2007-8/20078301714575472.shtml image.jsp<%@ page contentType="image/jpeg"%><%@ page import="java.awt.*"%><%@ page import="java.awt.image.*"%><%@ page import="java.util.*"%><%@ page import="javax.imageio.*"%><%//在内存中创建图象int iWidth=130,iHeight=18;BufferedImage image=new BufferedImage(iWidth,iHeight,BufferedImage.TYPE_INT_RGB);//获取图形上下文Graphics g=image.getGraphics();//设定背景色g.setColor(Color.white);g.fillRect(0,0,iWidth,iHeight);//画边框g.setColor(Color.black);g.drawRect(0,0,iWidth-1,iHeight-1);//取随机产生的认证码(4位数字)String rand=request.getParameter("Rand");rand=rand.substring(0,rand.indexOf("."));switch(rand.length()){case 1:rand="000"+rand;break;case 2:rand="00"+rand;break;case 3:rand="0"+rand;break;default:rand=rand.substring(0,4);break;}//将认证码存入SESSIONsession.setAttribute("Rand",rand);//将认证码显示到图象中g.setColor(Color.black);g.setFont(new Font("Times New Roman",Font.PLAIN,18));g.drawString(rand,10,15);//随机产生88个干扰点,使图象中的认证码不易被其它程序探测到Random random=new Random();for(int iIndex=0;iIndex<88;iIndex++){int x=random.nextInt(iWidth);int y=random.nextInt(iHeight);g.drawLine(x,y,x,y);}//图象生效g.dispose();//输出图象到页面ImageIO.write(image,"JPEG",response.getOutputStream());%>输出时应用验证码<script>document.write("<img border=0 src='/image.jsp?Rand="+Math.random()*10000+"'>");</script><br> 输认证码: <input name="Rand" maxlength=4 size="10"><br>登录认证:String Rand=request.getParameter("Rand");String strRand=(String)session.getAttribute("Rand");if(!strRand.equals(Rand))JSP生成中文图片验证码<%@page contentType="image/jpeg" pageEncoding="UTF-8" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%><%!//生成随机颜色Color getRandColor(Random random, int fc, int bc) {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);}%><%//设置页面不缓存response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);// 设置图片的长宽int width = 176, height = 30;//设置备选汉字,剔除一些不雅的汉字String base = "u7684u4e00u4e86u662fu6211u4e0du5728u4ebau4eecu6709u6765u4ed6u8fd9u4e0au7740u4e2au5730u5230u5927u91ccu8bf4u5c31u53bbu5b50u5f97u4e5fu548cu90a3u8981u4e0bu770bu5929u65f6u8fc7u51fau5c0fu4e48u8d77u4f60u90fdu628au597du8fd8u591au6ca1u4e3au53c8u53efu5bb6u5b66u53eau4ee5u4e3bu4f1au6837u5e74u60f3u751fu540cu8001u4e2du5341u4eceu81eau9762u524du5934u9053u5b83u540eu7136u8d70u5f88u50cfu89c1u4e24u7528u5979u56fdu52a8u8fdbu6210u56deu4ec0u8fb9u4f5cu5bf9u5f00u800cu5df1u4e9bu73b0u5c71u6c11u5019u7ecfu53d1u5de5u5411u4e8bu547du7ed9u957fu6c34u51e0u4e49u4e09u58f0u4e8eu9ad8u624bu77e5u7406u773cu5fd7u70b9u5fc3u6218u4e8cu95eeu4f46u8eabu65b9u5b9eu5403u505au53ebu5f53u4f4fu542cu9769u6253u5462u771fu5168u624du56dbu5df2u6240u654cu4e4bu6700u5149u4ea7u60c5u8defu5206u603bu6761u767du8bddu4e1cu5e2du6b21u4eb2u5982u88abu82b1u53e3u653eu513fu5e38u6c14u4e94u7b2cu4f7fu5199u519bu5427u6587u8fd0u518du679cu600eu5b9au8bb8u5febu660eu884cu56e0u522bu98deu5916u6811u7269u6d3bu90e8u95e8u65e0u5f80u8239u671bu65b0u5e26u961fu5148u529bu5b8cu5374u7ad9u4ee3u5458u673au66f4u4e5du60a8u6bcfu98ceu7ea7u8ddfu7b11u554au5b69u4e07u5c11u76f4u610fu591cu6bd4u9636u8fdeu8f66u91cdu4fbfu6597u9a6cu54eau5316u592au6307u53d8u793eu4f3cu58ebu8005u5e72u77f3u6ee1u65e5u51b3u767eu539fu62ffu7fa4u7a76u5404u516du672cu601du89e3u7acbu6cb3u6751u516bu96beu65e9u8bbau5417u6839u5171u8ba9u76f8u7814u4ecau5176u4e66u5750u63a5u5e94u5173u4fe1u89c9u6b65u53cdu5904u8bb0u5c06u5343u627eu4e89u9886u6216u5e08u7ed3u5757u8dd1u8c01u8349u8d8au5b57u52a0u811au7d27u7231u7b49u4e60u9635u6015u6708u9752u534au706bu6cd5u9898u5efau8d76u4f4du5531u6d77u4e03u5973u4efbu4ef6u611fu51c6u5f20u56e2u5c4bu79bbu8272u8138u7247u79d1u5012u775bu5229u4e16u521au4e14u7531u9001u5207u661fu5bfcu665au8868u591fu6574u8ba4u54cdu96eau6d41u672au573au8be5u5e76u5e95u6df1u523bu5e73u4f1fu5fd9u63d0u786eu8fd1u4eaeu8f7bu8bb2u519cu53e4u9ed1u544au754cu62c9u540du5440u571fu6e05u9633u7167u529eu53f2u6539u5386u8f6cu753bu9020u5634u6b64u6cbbu5317u5fc5u670du96e8u7a7fu5185u8bc6u9a8cu4f20u4e1au83dcu722cu7761u5174u5f62u91cfu54b1u89c2u82e6u4f53u4f17u901au51b2u5408u7834u53cbu5ea6u672fu996du516cu65c1u623fu6781u5357u67aau8bfbu6c99u5c81u7ebfu91ceu575au7a7au6536u7b97u81f3u653fu57ceu52b3u843du94b1u7279u56f4u5f1fu80dcu6559u70edu5c55u5305u6b4cu7c7bu6e10u5f3au6570u4e61u547cu6027u97f3u7b54u54e5u9645u65e7u795eu5ea7u7ae0u5e2eu5566u53d7u7cfbu4ee4u8df3u975eu4f55u725bu53d6u5165u5cb8u6562u6389u5ffdu79cdu88c5u9876u6025u6797u505cu606fu53e5u533au8863u822cu62a5u53f6u538bu6162u53d4u80ccu7ec6";//备选汉字的长度int length = base.length();//创建内存图像BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 获取图形上下文Graphics g = image.getGraphics();//创建随机类的实例Random random = new Random();// 设定图像背景色(因为是做背景,所以偏淡)g.setColor(getRandColor(random, 200, 250));g.fillRect(0, 0, width, height);//备选字体String[] fontTypes = {"u5b8bu4f53", "u65b0u5b8bu4f53", "u9ed1u4f53", "u6977u4f53", "u96b6u4e66"};int fontTypesLength = fontTypes.length;//在图片背景上增加噪点g.setColor(getRandColor(random, 160, 200));g.setFont(new Font("Times New Roman", Font.PLAIN, 14));for (int i = 0; i < 6; i++) {g.drawString("*********************************************", 0, 5 * (i + 2));}//取随机产生的认证码(6个汉字)//保存生成的汉字字符串String sRand = "";for (int i = 0; i < 6; i++) {int start = random.nextInt(length);String rand = base.substring(start, start + 1);sRand += rand;//设置字体的颜色g.setColor(getRandColor(random, 10, 150));//设置字体g.setFont(new Font(fontTypes[random.nextInt(fontTypesLength)], Font.BOLD, 18 + random.nextInt(6)));//将此汉字画到图片上g.drawString(rand, 24 * i + 10 + random.nextInt(8), 24);}//将认证码存入sessionsession.setAttribute("rand", sRand);g.dispose();//输出图象到页面ImageIO.write(image, "JPEG", response.getOutputStream());%> http://hi.baidu.com/dou%5Fye/blog/item/b8c4b6ca4fea0943f21fe73a.html直接拷走就能用~~~ 上面给出了那么多的验证码实现来看看验证码的原理吧验证码是由后台程序随机生成一个字符串,将这个字符串记录在 session 中,同时将这个字符串写入到一个图片流中,一般采用 Servlet,将 Servlet 的 contentType 设为 image/jpeg,再把图片流写入到 response 的 OutputStream 中,这时在请求这个 Servlet 时就不是在请求页面了,而是在请求一张图片。页面上可以用 img 标签的 src 属性指向这个 Servlet,这时在页面上就会显示一张在 Servlet 中写进去的图片。当用户输入验证码提交后,后台再从 session 中把刚才生成的那个随机字符串取出来与用户输入的验证码进行对比,如果相同则将这个字符串从 session 中移掉做其他的事情,如果不相同说明输入错误则退回去上一页面,这时在页面上显示的验证码已经不是先前的那个了,因为重新请求了一次,又重新生成了一下。验证码的好处在于可以防止使用灌水机进行注册、登录和进行灌水活动。常见的验证码基本上是一些数字、字母和汉字。当然了,我们也可以在验证码的中生成一个算术公式,让人去填入计算结果什么的,这种就稍微的复杂一些。总之,没有做不到的,只有想不到的。 google一下就成了 有都是的 Servlet的程序import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.awt.image.*;import javax.imageio.*;import java.awt.*;public class CheckCodeServlet { private static int WIDTH=60; private static int HEIGHT=20; public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{ HttpSession session=request.getSession(); response.setContentType("text/html;charset=gb2312"); ServletOutputStream sos=response.getOutputStream(); //设置浏览器不缓存 response.addHeader("Pragma","No-cache"); response.addHeader("Cache-Control", "no-cache"); response.addDateHeader("Expires", 0); BufferedImage image=new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB); Graphics g=image.getGraphics(); char [] rands=generateCheckCode(); drawRands(g,rands); ByteArrayOutputStream bos=new ByteArrayOutputStream(); ImageIO.write(image, "JPEG", bos); byte[] buf=bos.toByteArray(); //设置大小多少 response.setContentLength(buf.length); sos.write(buf); sos.close(); bos.close(); } private char [] generateCheckCode(){ String chars="123456789abcdefghijklmnopqrstuvwxyz"; char [] rands=new char[4]; for(int i=0;i<4;i++){ int rand=(int)(Math.random()*36); rands[i]=chars.charAt(rand); } return rands; } private void drawRands(Graphics g,char[] rands){ g.setColor(Color.black); g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18)); g.drawString(""+rands[0],1,17); g.drawString(""+rands[1], 16, 15); g.drawString(""+rands[3], 46, 16); System.out.println(rands); }} 楼主还可以使用开源的东西,比如jcaptchahttp://jcaptcha.sourceforge.net/ 这东西不用自己写,COPY一下.改改就是自己的了. servlet抛出异常到一个指定的jsp页面显示 jsp中调用javabean时为什么不能加载类呢 不圾远程访问tomcat5.0.28 高手请教,如何做到网页上的资料只能看不能下载呢? jsp中从数据库读取多副图片问题!! 求chat server 程序 jsp的奇怪问题 ====怎样是哟个这段代码===== 输入任意年,月,日,如何取得该日期是星期几? 急!tomcat卸载后其中的文件丢失,能不能恢复,如何恢复,有没有工具! 一个很棘手的java web开发面试题 oracle查询数据问题
java.awt.image.*,java.util.*,javax.imageio.*" %>
<%
// 在内存中创建图象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB); // 获取图形上下文
Graphics g = image.getGraphics(); // 设定背景色
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height); //画边框
g.setColor(Color.black);
g.drawRect(0,0,width-1,height-1); // 取随机产生的认证码(4位数字)
String rand = request.getParameter("rand");
rand = rand.substring(0,rand.indexOf("."));
switch(rand.length())
{
case 1: rand = "000"+rand; break;
case 2: rand = "00"+rand; break;
case 3: rand = "0"+rand; break;
default: rand = rand.substring(0,4); break;
} // 将认证码存入SESSION
session.setAttribute("rand",rand); // 将认证码显示到图象中
g.se
tColor(Color.black);
Integer tempNumber = new Integer(rand);
String numberStr = tempNumber.toString(); g.setFont(new Font("Atlantic Inline",Font.PLAIN,18));
String Str = numberStr.substring(0,1);
g.drawString(Str,8,17); Str = numberStr.substring(1,2);
g.drawString(Str,20,15);
Str = numberStr.substring(2,3);
g.drawString(Str,35,18); Str = numberStr.substring(3,4);
g.drawString(Str,45,15); // 随机产生88个干扰点,使图象中的认证码不易被其它程序探测到
Random random = new Random();
for (int i=0;i<20;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
g.drawOval(x,y,0,0);
} // 图象生效
g.dispose(); // 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
%>
package org.javawind.servlet;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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SysCode extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
private static final long serialVersionUID = -5981700888850353189L;
public SysCode() {
super();
} @SuppressWarnings("static-access")
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("image/jpeg"); //必须设置ContentType为image/jpeg
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
//设置图片的长宽 验证码长度
int width=60, height=20,len=4;
String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
int length = base.length();
//创建内存图像
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//获取图形上下文
Graphics g = image.getGraphics();
//创建随机类的实例
Random random = new Random();
//设定图像背景色(因为是做背景,所以偏淡)
g.setColor(getRandColor(random,200,250));
g.fillRect(0, 0, width, height);
//备选字体
String[] fontTypes = {"tahoma","Atlantic Inline","fantasy","Times New Roman","Georgia","Arial", "Helvetica", "sans-serif","System"};
int fontTypesLength = fontTypes.length;
//在图片背景上增加噪点
g.setColor(getRandColor(random,160,200));
g.setFont(new Font("Times New Roman",Font.PLAIN,12));
for (int i=0;i<6;i++)
{
g.drawString("!@#$%^,.;'[javawind.net]/<&*()>:5277",0,5*(i+2));
}
String sRand="",pStr="";
for (int i=0;i<len;i++)
{
int start = random.nextInt(length);
String rand=base.substring(start,start+1);
sRand+=rand;
//设置字体的颜色
g.setColor(getRandColor(random,10,150));
//设置字体
g.setFont(new Font(fontTypes[random.nextInt(fontTypesLength)],Font.BOLD,16));
//将随机验证码画到图片上
//g.drawString(rand,15*i,18);
pStr = sRand.substring(i,i+1);
if(i==0){
g.drawString(pStr,2,14);
}
if(i==1){
g.drawString(pStr,15,16);
}
if(i==2){
g.drawString(pStr,30,15);
}
if(i==3){
g.drawString(pStr,45,13);
}
}
//将认证码存入session
request.getSession().setAttribute("SystemCode",sRand);
g.dispose();
//输出图象到页面
ImageIO.write(image,"JPEG",response.getOutputStream());
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
protected Color getRandColor(Random random,int fc,int bc)
{
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);
}
}
参照这http://blog.csdn.net/iqyeah/archive/2006/11/03/1364538.aspx
<%@page contentType="image/jpeg" pageEncoding="UTF-8" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%>
<%!
//生成随机颜色
Color getRandColor(Random random, int fc, int bc) {
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);
}
%>
<%
//设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 设置图片的长宽
int width = 176, height = 30;
//设置备选汉字,剔除一些不雅的汉字
String base = "u7684u4e00u4e86u662fu6211u4e0du5728u4ebau4eecu6709u6765u4ed6u8fd9u4e0au7740u4e2au5730u5230u5927u91ccu8bf4u5c31u53bbu5b50u5f97u4e5fu548cu90a3u8981u4e0bu770bu5929u65f6u8fc7u51fau5c0fu4e48u8d77u4f60u90fdu628au597du8fd8u591au6ca1u4e3au53c8u53efu5bb6u5b66u53eau4ee5u4e3bu4f1au6837u5e74u60f3u751fu540cu8001u4e2du5341u4eceu81eau9762u524du5934u9053u5b83u540eu7136u8d70u5f88u50cfu89c1u4e24u7528u5979u56fdu52a8u8fdbu6210u56deu4ec0u8fb9u4f5cu5bf9u5f00u800cu5df1u4e9bu73b0u5c71u6c11u5019u7ecfu53d1u5de5u5411u4e8bu547du7ed9u957fu6c34u51e0u4e49u4e09u58f0u4e8eu9ad8u624bu77e5u7406u773cu5fd7u70b9u5fc3u6218u4e8cu95eeu4f46u8eabu65b9u5b9eu5403u505au53ebu5f53u4f4fu542cu9769u6253u5462u771fu5168u624du56dbu5df2u6240u654cu4e4bu6700u5149u4ea7u60c5u8defu5206u603bu6761u767du8bddu4e1cu5e2du6b21u4eb2u5982u88abu82b1u53e3u653eu513fu5e38u6c14u4e94u7b2cu4f7fu5199u519bu5427u6587u8fd0u518du679cu600eu5b9au8bb8u5febu660eu884cu56e0u522bu98deu5916u6811u7269u6d3bu90e8u95e8u65e0u5f80u8239u671bu65b0u5e26u961fu5148u529bu5b8cu5374u7ad9u4ee3u5458u673au66f4u4e5du60a8u6bcfu98ceu7ea7u8ddfu7b11u554au5b69u4e07u5c11u76f4u610fu591cu6bd4u9636u8fdeu8f66u91cdu4fbfu6597u9a6cu54eau5316u592au6307u53d8u793eu4f3cu58ebu8005u5e72u77f3u6ee1u65e5u51b3u767eu539fu62ffu7fa4u7a76u5404u516du672cu601du89e3u7acbu6cb3u6751u516bu96beu65e9u8bbau5417u6839u5171u8ba9u76f8u7814u4ecau5176u4e66u5750u63a5u5e94u5173u4fe1u89c9u6b65u53cdu5904u8bb0u5c06u5343u627eu4e89u9886u6216u5e08u7ed3u5757u8dd1u8c01u8349u8d8au5b57u52a0u811au7d27u7231u7b49u4e60u9635u6015u6708u9752u534au706bu6cd5u9898u5efau8d76u4f4du5531u6d77u4e03u5973u4efbu4ef6u611fu51c6u5f20u56e2u5c4bu79bbu8272u8138u7247u79d1u5012u775bu5229u4e16u521au4e14u7531u9001u5207u661fu5bfcu665au8868u591fu6574u8ba4u54cdu96eau6d41u672au573au8be5u5e76u5e95u6df1u523bu5e73u4f1fu5fd9u63d0u786eu8fd1u4eaeu8f7bu8bb2u519cu53e4u9ed1u544au754cu62c9u540du5440u571fu6e05u9633u7167u529eu53f2u6539u5386u8f6cu753bu9020u5634u6b64u6cbbu5317u5fc5u670du96e8u7a7fu5185u8bc6u9a8cu4f20u4e1au83dcu722cu7761u5174u5f62u91cfu54b1u89c2u82e6u4f53u4f17u901au51b2u5408u7834u53cbu5ea6u672fu996du516cu65c1u623fu6781u5357u67aau8bfbu6c99u5c81u7ebfu91ceu575au7a7au6536u7b97u81f3u653fu57ceu52b3u843du94b1u7279u56f4u5f1fu80dcu6559u70edu5c55u5305u6b4cu7c7bu6e10u5f3au6570u4e61u547cu6027u97f3u7b54u54e5u9645u65e7u795eu5ea7u7ae0u5e2eu5566u53d7u7cfbu4ee4u8df3u975eu4f55u725bu53d6u5165u5cb8u6562u6389u5ffdu79cdu88c5u9876u6025u6797u505cu606fu53e5u533au8863u822cu62a5u53f6u538bu6162u53d4u80ccu7ec6";
//备选汉字的长度
int length = base.length();
//创建内存图像
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
//创建随机类的实例
Random random = new Random();
// 设定图像背景色(因为是做背景,所以偏淡)
g.setColor(getRandColor(random, 200, 250));
g.fillRect(0, 0, width, height);
//备选字体
String[] fontTypes = {
"u5b8bu4f53", "u65b0u5b8bu4f53", "u9ed1u4f53", "u6977u4f53", "u96b6u4e66"};
int fontTypesLength = fontTypes.length;
//在图片背景上增加噪点
g.setColor(getRandColor(random, 160, 200));
g.setFont(new Font("Times New Roman", Font.PLAIN, 14));
for (int i = 0; i < 6; i++) {
g.drawString("*********************************************", 0, 5 * (i + 2));
}
//取随机产生的认证码(6个汉字)
//保存生成的汉字字符串
String sRand = "";
for (int i = 0; i < 6; i++) {
int start = random.nextInt(length);
String rand = base.substring(start, start + 1);
sRand += rand;
//设置字体的颜色
g.setColor(getRandColor(random, 10, 150));
//设置字体
g.setFont(new Font(fontTypes[random.nextInt(fontTypesLength)], Font.BOLD, 18 + random.nextInt(6)));
//将此汉字画到图片上
g.drawString(rand, 24 * i + 10 + random.nextInt(8), 24);
}
//将认证码存入session
session.setAttribute("rand", sRand);
g.dispose();
//输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
%>
http://www.dwww.cn/News/2007-8/20078301714575472.shtml
<%@ page import="java.awt.*"%>
<%@ page import="java.awt.image.*"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.imageio.*"%>
<%
//在内存中创建图象
int iWidth=130,iHeight=18;
BufferedImage image=new BufferedImage(iWidth,iHeight,BufferedImage.TYPE_INT_RGB);
//获取图形上下文
Graphics g=image.getGraphics();
//设定背景色
g.setColor(Color.white);
g.fillRect(0,0,iWidth,iHeight);
//画边框
g.setColor(Color.black);
g.drawRect(0,0,iWidth-1,iHeight-1);
//取随机产生的认证码(4位数字)
String rand=request.getParameter("Rand");
rand=rand.substring(0,rand.indexOf("."));
switch(rand.length())
{
case 1:rand="000"+rand;break;
case 2:rand="00"+rand;break;
case 3:rand="0"+rand;break;
default:rand=rand.substring(0,4);break;
}
//将认证码存入SESSION
session.setAttribute("Rand",rand);
//将认证码显示到图象中
g.setColor(Color.black);
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
g.drawString(rand,10,15);
//随机产生88个干扰点,使图象中的认证码不易被其它程序探测到
Random random=new Random();
for(int iIndex=0;iIndex<88;iIndex++)
{
int x=random.nextInt(iWidth);
int y=random.nextInt(iHeight);
g.drawLine(x,y,x,y);
}
//图象生效
g.dispose();
//输出图象到页面
ImageIO.write(image,"JPEG",response.getOutputStream());
%>
输出时应用验证码<script>document.write("<img border=0 src='/image.jsp?Rand="+Math.random()*10000+"'>");</script><br>
输认证码: <input name="Rand" maxlength=4 size="10"><br>
登录认证:String Rand=request.getParameter("Rand");
String strRand=(String)session.getAttribute("Rand");
if(!strRand.equals(Rand))JSP生成中文图片验证码<%@page contentType="image/jpeg" pageEncoding="UTF-8" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%>
<%!
//生成随机颜色
Color getRandColor(Random random, int fc, int bc) {
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);
}
%>
<%
//设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 设置图片的长宽
int width = 176, height = 30;
//设置备选汉字,剔除一些不雅的汉字
String base = "u7684u4e00u4e86u662fu6211u4e0du5728u4ebau4eecu6709u6765u4ed6u8fd9u4e0au7740u4e2au5730u5230u5927u91ccu8bf4u5c31u53bbu5b50u5f97u4e5fu548cu90a3u8981u4e0bu770bu5929u65f6u8fc7u51fau5c0fu4e48u8d77u4f60u90fdu628au597du8fd8u591au6ca1u4e3au53c8u53efu5bb6u5b66u53eau4ee5u4e3bu4f1au6837u5e74u60f3u751fu540cu8001u4e2du5341u4eceu81eau9762u524du5934u9053u5b83u540eu7136u8d70u5f88u50cfu89c1u4e24u7528u5979u56fdu52a8u8fdbu6210u56deu4ec0u8fb9u4f5cu5bf9u5f00u800cu5df1u4e9bu73b0u5c71u6c11u5019u7ecfu53d1u5de5u5411u4e8bu547du7ed9u957fu6c34u51e0u4e49u4e09u58f0u4e8eu9ad8u624bu77e5u7406u773cu5fd7u70b9u5fc3u6218u4e8cu95eeu4f46u8eabu65b9u5b9eu5403u505au53ebu5f53u4f4fu542cu9769u6253u5462u771fu5168u624du56dbu5df2u6240u654cu4e4bu6700u5149u4ea7u60c5u8defu5206u603bu6761u767du8bddu4e1cu5e2du6b21u4eb2u5982u88abu82b1u53e3u653eu513fu5e38u6c14u4e94u7b2cu4f7fu5199u519bu5427u6587u8fd0u518du679cu600eu5b9au8bb8u5febu660eu884cu56e0u522bu98deu5916u6811u7269u6d3bu90e8u95e8u65e0u5f80u8239u671bu65b0u5e26u961fu5148u529bu5b8cu5374u7ad9u4ee3u5458u673au66f4u4e5du60a8u6bcfu98ceu7ea7u8ddfu7b11u554au5b69u4e07u5c11u76f4u610fu591cu6bd4u9636u8fdeu8f66u91cdu4fbfu6597u9a6cu54eau5316u592au6307u53d8u793eu4f3cu58ebu8005u5e72u77f3u6ee1u65e5u51b3u767eu539fu62ffu7fa4u7a76u5404u516du672cu601du89e3u7acbu6cb3u6751u516bu96beu65e9u8bbau5417u6839u5171u8ba9u76f8u7814u4ecau5176u4e66u5750u63a5u5e94u5173u4fe1u89c9u6b65u53cdu5904u8bb0u5c06u5343u627eu4e89u9886u6216u5e08u7ed3u5757u8dd1u8c01u8349u8d8au5b57u52a0u811au7d27u7231u7b49u4e60u9635u6015u6708u9752u534au706bu6cd5u9898u5efau8d76u4f4du5531u6d77u4e03u5973u4efbu4ef6u611fu51c6u5f20u56e2u5c4bu79bbu8272u8138u7247u79d1u5012u775bu5229u4e16u521au4e14u7531u9001u5207u661fu5bfcu665au8868u591fu6574u8ba4u54cdu96eau6d41u672au573au8be5u5e76u5e95u6df1u523bu5e73u4f1fu5fd9u63d0u786eu8fd1u4eaeu8f7bu8bb2u519cu53e4u9ed1u544au754cu62c9u540du5440u571fu6e05u9633u7167u529eu53f2u6539u5386u8f6cu753bu9020u5634u6b64u6cbbu5317u5fc5u670du96e8u7a7fu5185u8bc6u9a8cu4f20u4e1au83dcu722cu7761u5174u5f62u91cfu54b1u89c2u82e6u4f53u4f17u901au51b2u5408u7834u53cbu5ea6u672fu996du516cu65c1u623fu6781u5357u67aau8bfbu6c99u5c81u7ebfu91ceu575au7a7au6536u7b97u81f3u653fu57ceu52b3u843du94b1u7279u56f4u5f1fu80dcu6559u70edu5c55u5305u6b4cu7c7bu6e10u5f3au6570u4e61u547cu6027u97f3u7b54u54e5u9645u65e7u795eu5ea7u7ae0u5e2eu5566u53d7u7cfbu4ee4u8df3u975eu4f55u725bu53d6u5165u5cb8u6562u6389u5ffdu79cdu88c5u9876u6025u6797u505cu606fu53e5u533au8863u822cu62a5u53f6u538bu6162u53d4u80ccu7ec6";
//备选汉字的长度
int length = base.length();
//创建内存图像
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
//创建随机类的实例
Random random = new Random();
// 设定图像背景色(因为是做背景,所以偏淡)
g.setColor(getRandColor(random, 200, 250));
g.fillRect(0, 0, width, height);
//备选字体
String[] fontTypes = {
"u5b8bu4f53", "u65b0u5b8bu4f53", "u9ed1u4f53", "u6977u4f53", "u96b6u4e66"};
int fontTypesLength = fontTypes.length;
//在图片背景上增加噪点
g.setColor(getRandColor(random, 160, 200));
g.setFont(new Font("Times New Roman", Font.PLAIN, 14));
for (int i = 0; i < 6; i++) {
g.drawString("*********************************************", 0, 5 * (i + 2));
}
//取随机产生的认证码(6个汉字)
//保存生成的汉字字符串
String sRand = "";
for (int i = 0; i < 6; i++) {
int start = random.nextInt(length);
String rand = base.substring(start, start + 1);
sRand += rand;
//设置字体的颜色
g.setColor(getRandColor(random, 10, 150));
//设置字体
g.setFont(new Font(fontTypes[random.nextInt(fontTypesLength)], Font.BOLD, 18 + random.nextInt(6)));
//将此汉字画到图片上
g.drawString(rand, 24 * i + 10 + random.nextInt(8), 24);
}
//将认证码存入session
session.setAttribute("rand", sRand);
g.dispose();
//输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
%>
直接拷走就能用~~~
入到一个图片流中,一般采用 Servlet,将 Servlet 的 contentType 设为 image/jpeg,再把
图片流写入到 response 的 OutputStream 中,这时在请求这个 Servlet 时就不是在请求页面了,
而是在请求一张图片。页面上可以用 img 标签的 src 属性指向这个 Servlet,这时在页面上就会显示一张在 Servlet 中
写进去的图片。当用户输入验证码提交后,后台再从 session 中把刚才生成的那个随机字符串取出来与用户输入的验
证码进行对比,如果相同则将这个字符串从 session 中移掉做其他的事情,如果不相同说明输入错误
则退回去上一页面,这时在页面上显示的验证码已经不是先前的那个了,因为重新请求了一次,又重新
生成了一下。验证码的好处在于可以防止使用灌水机进行注册、登录和进行灌水活动。常见的验证码基本上是一些数字、字母和汉字。当然了,我们也可以在验证码的中生成一个算术公式,让
人去填入计算结果什么的,这种就稍微的复杂一些。总之,没有做不到的,只有想不到的。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.image.*;
import javax.imageio.*;
import java.awt.*;
public class CheckCodeServlet {
private static int WIDTH=60;
private static int HEIGHT=20;
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
HttpSession session=request.getSession();
response.setContentType("text/html;charset=gb2312");
ServletOutputStream sos=response.getOutputStream();
//设置浏览器不缓存
response.addHeader("Pragma","No-cache");
response.addHeader("Cache-Control", "no-cache");
response.addDateHeader("Expires", 0);
BufferedImage image=new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
char [] rands=generateCheckCode();
drawRands(g,rands);
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ImageIO.write(image, "JPEG", bos);
byte[] buf=bos.toByteArray();
//设置大小多少
response.setContentLength(buf.length);
sos.write(buf);
sos.close();
bos.close();
}
private char [] generateCheckCode(){
String chars="123456789abcdefghijklmnopqrstuvwxyz";
char [] rands=new char[4];
for(int i=0;i<4;i++){
int rand=(int)(Math.random()*36);
rands[i]=chars.charAt(rand);
}
return rands;
}
private void drawRands(Graphics g,char[] rands){
g.setColor(Color.black);
g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));
g.drawString(""+rands[0],1,17);
g.drawString(""+rands[1], 16, 15);
g.drawString(""+rands[3], 46, 16);
System.out.println(rands);
}
}