Servlet 产生 验证码图片 并放到页面中

来源:互联网 发布:java书籍下载 编辑:程序博客网 时间:2024/05/29 14:32

一、index.jsp 用来显示验证码及输入验证码。

<%@ page contentType="text/html;charset=utf-8" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>认证码输入页面</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <META HTTP-EQUIV="Expires" CONTENT="0"> </head><body><form method=post action="check.jsp"><table>    <tr>        <td align=left>系统产生的认证码:</td>        <!-- 调用Servlet产生验证码(gifServlet为url-pattern),点击时刷新图片(后面带的随机数,是为了防止图片缓存产生相同验证码) -->        <td><img border=0 src="gifServlet" onclick="this.src='gifServlet?a='+Math.random()+100"></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>     <% if( session.getAttribute("value") == null){     session.setAttribute("value","normal");     }      String value = session.getAttribute("value").toString(); %>     <% if(value.equals("true")){ %>     <font>输入正确!</font>     <% }else if(value.equals("false")){ %>     <font>输入错误,请重新输入!</font>     <%}else{ %>     <font>请输入验证码!</font>     <%} %></body></html>

二、Servlet 类,只响应get请求。

package com.servlet;import javax.imageio.ImageIO;import javax.servlet.http.*;import javax.servlet.ServletException;import java.util.Random;import java.awt.*;import java.awt.image.*;public class Servlet extends HttpServlet{    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,                     java.io.IOException{    //设置页面不缓存    resp.setHeader("Pragma","No-cache");    resp.setHeader("Cache-Control","no-cache");    resp.setDateHeader("Expires", 0);    // 在内存中创建图象    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="";    String[] chars = {"A","B","C","D","E","F","G","H","I","J","K","L",    "M","N","O","P","Q","R","S","T","U","V","W","S","Y","Z"    ,"1","2","3","4","5","6","7","8","9","0"};    for (int i=0;i<4;i++){    int rm = random.nextInt(36); //左闭右开区间        String rand=chars[rm];        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    HttpSession session = req.getSession();    session.setAttribute("rand",sRand);    // 图象生效    g.dispose();    // 输出图象到页面    ImageIO.write(image, "JPEG", resp.getOutputStream());    }        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);        }}

三、web.xml 配置Servlet

<servlet>        <servlet-name>gif</servlet-name>        <servlet-class>com.servlet.Servlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>gif</servlet-name>        <url-pattern>/gifServlet</url-pattern>    </servlet-mapping>

四、check.jsp 检验是否输入真确

<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %><%String rand = (String)session.getAttribute("rand");String input = request.getParameter("rand");  input =  input.toLowerCase();  rand = rand.toLowerCase();  if (rand.equals(input)) {   session.setAttribute("value", "true");  }else{   session.setAttribute("value", "false");  }%><script type="text/javascript">    window.location.href='index.jsp';   </script>

五、最终效果图


0 0