简单随机验证码的生成

来源:互联网 发布:免流量软件下载 编辑:程序博客网 时间:2024/06/06 05:01

登录界面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <script type="text/javascript">  function reloadimg(){    var obj = document.getElementById("checkimg");  obj.src="random.jsp?"+Math.random();    }  </script>  <body>    <form action="checklogin.jsp" >    验证码:<input type="text" name="ck" /><a href="javaScript:reloadimg()">    <img id="checkimg" src="random.jsp" ></a><br>        <input type="submit" value="提交" />    </form>  </body></html>



简单随机验证码的生成核心代码,生成二维码的部分

<%@ page language="java"import="java.util.*,java.io.*,java.awt.*,java.awt.image.*"pageEncoding="utf-8"%><%@page import="javax.imageio.ImageIO"%><%!//随机数生成器,用于产生随机数private Random random = new Random();//设定图片的宽度和高度private int width = 120;private int height = 30;%><%!private Color getRandomColor(int bound) {int r = random.nextInt(bound);int g = random.nextInt(bound);int b = random.nextInt(bound);return new Color(r, g, b);}public String getRandomString() {//字符串种子,将从该字符串中获得随机字符。因为o和0,l和1很难区分,所以,去掉大小写的o和lfinal String SEED = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz";StringBuffer sb = new StringBuffer("");for (int i = 0; i < 4; i++) {sb.append(SEED.charAt(random.nextInt(SEED.length())));}return sb.toString();}%><%//指定响应的内容内型response.setContentType("image/jpeg");//禁止图像缓存。response.setHeader("pragma", "no-cache");response.setHeader("cache-control", "no-cache");response.setDateHeader("expires", 0);   //在内存中创建图像对象BufferedImage bufImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);//获得图像对象的画笔Graphics2D g = (Graphics2D) (bufImg.getGraphics());//将图像填充成白色背景色g.setColor(Color.WHITE);g.fillRect(0, 0, width, height);//绘制图像的黑色边框g.setColor(Color.BLACK);g.drawRect(0, 0, width - 1, height - 1);//随机产生干扰点,并用不同的颜色表示,使图象中的认证码不易被其它程序探测到for (int i = 0; i < 200; i++) {//随机生成干扰点的坐标int x = random.nextInt(width);int y = random.nextInt(height);g.setColor(getRandomColor(200)); //设置干扰点的颜色,随机生成g.drawOval(x, y, 0, 0); //画干扰点}String strValidate = this.getRandomString(); //生成验证字符串g.setFont(new Font("Tahoma", Font.BOLD, 18)); //设置字体//画认证码,每个认证码在不同的水平位置String[] strAry = new String[4];//将验证字符串的文字逐个画到图像中for (int i = 0; i < strAry.length; i++) {strAry[i] = strValidate.substring(i, i + 1);int w = 0;int x = (i + 1) % 3;//随机生成验证码字符的水平偏移量if (x == random.nextInt(3)) {w = 19 - random.nextInt(7);} else {w = 19 + random.nextInt(7);}//随机生成字体颜色g.setColor(this.getRandomColor(225));g.drawString(strAry[i], 30 * i + 10, w); //在图像中画文字}//画干扰线for (int i = 0; i < 5; i++) {//随机生成干扰线的起始和终止坐标int x = random.nextInt(width);int y = random.nextInt(height);int xx = random.nextInt(width);int yy = random.nextInt(height);g.setColor(getRandomColor(180));g.drawLine(x, y, xx, yy); //画干扰线}try {g.dispose();ImageIO.write(bufImg, "JPEG",response.getOutputStream()); //将生成的图片写入到指定的输出流中} catch (Exception ioe) {}out.clear();out = pageContext.pushBody();session.setAttribute("validateCode", strValidate); //将验证字符串保存到session中%>

,其实可以放到java类中写,这是放在jsp页面写的

最后来一个界面验证成功

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>My JSP 'checklogin.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">-->  </head>    <body>    <h1><%=request.getParameter("ck") %></h1>    <h1>${validateCode }</h1>  </body></html>


原创粉丝点击