| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
cwf8
10年前发布

java实现验证码完整版

第一步:在web.xml中配置servlet

    <servlet>            <servlet-name>ImageServlet</servlet-name>            <servlet-class>org.servlet.ImageServlet</servlet-class>        </servlet>        <servlet-mapping>            <servlet-name>ImageServlet</servlet-name>            <url-pattern>/ImageServlet</url-pattern>        </servlet-mapping>  

</div> </div> 第二步: ImageServlet 实现
    import javax.servlet.ServletException;        import javax.servlet.http.HttpServlet;        import javax.servlet.http.HttpServletRequest;        import javax.servlet.http.HttpServletResponse;                import com.farm.web.tool.RandomValidateCode;                public class ImageServlet extends HttpServlet {                    private static final long serialVersionUID = 1L;                    public void doGet(HttpServletRequest request, HttpServletResponse response)                    throws ServletException, IOException {                        response.setContentType("image/jpeg");// 设置相应类型,告诉浏览器输出的内容为图片                response.setHeader("Pragma", "No-cache");// 设置响应头信息,告诉浏览器不要缓存此内容                response.setHeader("Cache-Control", "no-cache");                response.setDateHeader("Expire", 0);                RandomValidateCode randomValidateCode = new RandomValidateCode();                try {                    randomValidateCode.getRandcode(request, response);// 输出图片方法                } catch (Exception e) {                    e.printStackTrace();                }            }                    public void doPost(HttpServletRequest request, HttpServletResponse response)                    throws ServletException, IOException {                doGet(request, response);            }                }  

    import java.awt.Color;        import java.awt.Font;        import java.awt.Graphics;        import java.awt.image.BufferedImage;        import java.util.Random;                import javax.imageio.ImageIO;        import javax.servlet.http.HttpServletRequest;        import javax.servlet.http.HttpServletResponse;        import javax.servlet.http.HttpSession;                public class RandomValidateCode {                    public static String validateCode = null;            public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";// 放到session中的key            private Random random = new Random();            private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 随机产生的字符串                    private int width = 80;// 图片宽            private int height = 26;// 图片高            private int lineSize = 40;// 干扰线数量            private int stringNum = 4;// 随机产生字符数量                    /*            * 获得字体            */            private Font getFont() {                return new Font("Fixedsys", Font.CENTER_BASELINE, 18);            }                    /*            * 获得颜色            */            private Color getRandColor(int fc, int bc) {                if (fc > 255)                    fc = 255;                if (bc > 255)                    bc = 255;                int r = fc + random.nextInt(bc - fc - 16);                int g = fc + random.nextInt(bc - fc - 14);                int b = fc + random.nextInt(bc - fc - 18);                return new Color(r, g, b);            }                    /**            * 生成随机图片            */            public void getRandcode(HttpServletRequest request,                    HttpServletResponse response) {                HttpSession session = request.getSession();                // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类                BufferedImage image = new BufferedImage(width, height,                        BufferedImage.TYPE_INT_BGR);                Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作                g.fillRect(0, 0, width, height);                g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));                g.setColor(getRandColor(110, 133));                // 绘制干扰线                for (int i = 0; i <= lineSize; i++) {                    drowLine(g);                }                // 绘制随机字符                String randomString = "";                for (int i = 1; i <= stringNum; i++) {                    randomString = drowString(g, randomString, i);                }                session.removeAttribute(RANDOMCODEKEY);                session.setAttribute(RANDOMCODEKEY, randomString);                validateCode = randomString.toUpperCase();                g.dispose();                try {                    ImageIO.write(image, "JPEG", response.getOutputStream());// 将内存中的图片通过流动形式输出到客户端                } catch (Exception e) {                    e.printStackTrace();                }            }                    /*            * 绘制字符串            */            private String drowString(Graphics g, String randomString, int i) {                g.setFont(getFont());                g.setColor(new Color(random.nextInt(101), random.nextInt(111), random                        .nextInt(121)));                String rand = String.valueOf(getRandomString(random.nextInt(randString                        .length())));                randomString += rand;                g.translate(random.nextInt(3), random.nextInt(3));                g.drawString(rand, 13 * i, 16);                return randomString;            }                    /*            * 绘制干扰线            */            private void drowLine(Graphics g) {                int x = random.nextInt(width);                int y = random.nextInt(height);                int xl = random.nextInt(13);                int yl = random.nextInt(15);                g.drawLine(x, y, x + xl, y + yl);            }                    /*            * 获取随机的字符            */            public String getRandomString(int num) {                return String.valueOf(randString.charAt(num));            }        }  


第三步:jsp展现
    <tr>            <td>                <div align="right">                    验证码:                </div>            </td>            <td>                <input style="width: 65px" id="validatecode" name="validatecode" type="text" />            </td>            <td>                <img title="看不清楚,换一张?" style="cursor: pointer;"                    onclick="javascript:refresh(this);"                    src="<PF:basePath/>/ImageServlet">            </td>        </tr>  

src路径根据情况修改
    function refresh(obj) {            obj.src = "<PF:basePath/>/ImageServlet?"+Math.random();          }  

</div> </div> 第四步:Action验证
if(RandomValidateCode.validateCode!=null&&validatecode.trim().toUpperCase().equals(RandomValidateCode.validateCode)){        System.out.println("验证码正确");    }  
</div> </div>