下面的例子是用Servlet生成的一个验证码,例子是模拟登陆。
login.jsp
- <%@pagelanguage="java"contentType="text/html;charset=utf-8"
- pageEncoding="utf-8"%>
- <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <metahttp-equiv="Content-Type"content="text/html;charset=utf-8">
- <title>验证码</title>
- </head>
- <body>
- <formaction="${pageContext.request.contextPath}/servlet/LoginServlet">
- <tableborder="0"cellspacing="0"cellpadding="0"width="50%">
- <tr>
- <tdwidth="20%"align="right">用户名:</td><tdcolspan="2"><inputtype="text"name="username"value=""size="34"/></td>
- </tr>
- <tr>
- <tdwidth="20%"align="right">密码:</td><tdcolspan="2"><inputtype="password"name="password"value=""size="35"/></td>
- </tr>
- <tr>
- <tdwidth="20%"align="right">验证码:</td><tdwidth="21%"><inputtype="text"name="code"value=""size="15"/></td><tdalign="left"><imgsrc="${pageContext.request.contextPath}/servlet/ImageCodeMakerServlet"width="100px"height="30"/></td>
- </tr>
- </table>
- </form>
- </body>
- </html>
在web.xml中
- <servlet>
- <servlet-name>login</servlet-name>
- <servlet-class>com.web.LoginServlet</servlet-class>
- </servlet>
- <servlet>
- <servlet-name>imageCodeMakerServlet</servlet-name>
- <servlet-class>com.web.ImageCodeMakerServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>login</servlet-name>
- <url-pattern>/servlet/LoginServlet</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>imageCodeMakerServlet</servlet-name>
- <url-pattern>/servlet/ImageCodeMakerServlet</url-pattern>
- </servlet-mapping>
在后台Servlet里
- importjava.io.IOException;
- importjavax.servlet.ServletException;
- importjavax.servlet.http.HttpServlet;
- importjavax.servlet.http.HttpServletRequest;
- importjavax.servlet.http.HttpServletResponse;
- importjavax.servlet.http.HttpSession;
- publicclassLoginServletextendsHttpServlet{
- @Override
- protectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)
- throwsServletException,IOException{
- Stringusername=request.getParameter("username");
- Stringpassword=request.getParameter("password");
- Stringcode=request.getParameter("code");//页面,用户输入的验证码
- HttpSessionsession=request.getSession();
- StringrandCode=(String)session.getAttribute("randCode");//得到系统生成的验证码
- if(randCode.equals(code)){//验证码输入正确
- System.out.println("验证码输入正确");
- }else{
- System.out.println("验证码不正确");
- }
- }
- }
ImageCodeMakerServlet如下
- importjava.awt.Color;
- importjava.awt.Font;
- importjava.awt.Graphics;
- importjava.awt.image.BufferedImage;
- importjava.io.IOException;
- importjava.util.Random;
- importjavax.imageio.ImageIO;
- importjavax.servlet.ServletException;
- importjavax.servlet.http.HttpServlet;
- importjavax.servlet.http.HttpServletRequest;
- importjavax.servlet.http.HttpServletResponse;
- publicclassImageCodeMakerServletextendsHttpServlet{
- publicImageCodeMakerServlet(){
- super();
- }
- publicvoiddestroy(){
- super.destroy();
- }
- publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)
- throwsServletException,IOException{
- //首先设置页面不缓存
- response.setHeader("Pragma","No-cache");
- response.setHeader("Cache-Control","no-cache");
- response.setDateHeader("Expires",0);
- //定义图片的宽度和高度
- intwidth=90,height=40;
- //创建一个图像对象
- BufferedImageimage=newBufferedImage(width,height,
- BufferedImage.TYPE_INT_RGB);
- //得到图像的环境对象
- Graphicsg=image.createGraphics();
- Randomrandom=newRandom();
- //用随机颜色填充图像背景
- g.setColor(getRandColor(180,250));
- g.fillRect(0,0,width,height);
- for(inti=0;i<5;i++){
- g.setColor(getRandColor(50,100));
- intx=random.nextInt(width);
- inty=random.nextInt(height);
- g.drawOval(x,y,4,4);
- }
- //设置字体,下面准备画随机数
- g.setFont(newFont("",Font.PLAIN,40));
- //随机数字符串
- StringsRand="";
- for(inti=0;i<4;i++){
- //生成四个数字字符
- Stringrand=String.valueOf(random.nextInt(10));
- sRand+=rand;
- //生成随机颜色
- g.setColor(newColor(20+random.nextInt(80),20+random
- .nextInt(100),20+random.nextInt(90)));
- //将随机数字画在图像上
- g.drawString(rand,(17+random.nextInt(3))*i+8,34);
- //生成干扰线
- for(intk=0;k<12;k++){
- intx=random.nextInt(width);
- inty=random.nextInt(height);
- intxl=random.nextInt(9);
- intyl=random.nextInt(9);
- g.drawLine(x,y,x+xl,y+yl);
- }
- }
- //将生成的随机数字字符串写入Session
- request.getSession(false).setAttribute("randcode",sRand);
- //使图像生效
- g.dispose();
- //输出图像到页面
- ImageIO.write(image,"JPEG",response.getOutputStream());
- }
- /**
- *Initializationoftheservlet.<br>
- *
- *@throwsServletException
- *ifanerroroccurs
- */
- publicvoidinit()throwsServletException{
- //Putyourcodehere
- }
- /**
- *产生一个随机的颜色
- *
- *@paramfc
- *颜色分量最小值
- *@parambc
- *颜色分量最大值
- *@return
- */
- publicColorgetRandColor(intfc,intbc){
- Randomrandom=newRandom();
- if(fc>255){
- fc=255;
- }
- if(bc>255){
- bc=255;
- }
- intr=fc+random.nextInt(bc-fc);
- intg=fc+random.nextInt(bc-fc);
- intb=fc+random.nextInt(bc-fc);
- returnnewColor(r,g,b);
- }
- }