用java生成验证码

来源:互联网 发布:软件开发述职报告 编辑:程序博客网 时间:2024/05/17 00:17
一、验证码的作用
    验证码是目前大多网站所支持并使用于注册登录的。其作用在于能有效防止恶意登录注册,验证码每次都不同,
这就防止了病毒或者软件自动申请用户及自动登陆的问题。

二、原理

    验证码于服务器端生成,发送给客户端,并以图像格式显示。客户端提交所显示的验证码,服务端接收并进行比较,若比对失败则不能实现登录或注册,反之成功后跳转相应界面。

代码如下:

----------------------------------ImageUtil.java-----------------------------------

package com.obtk.utils;import java.awt.*;import java.awt.image.BufferedImage;import java.io.*;import java.util.*;import javax.imageio.ImageIO;public class ImageUtil {        //根据阿拉伯数字和字母随机得到4个字符作为验证码public static char[] generateCheckCode() {String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";char[] rands = new char[4];for (int i = 0; i < 4; i++) {//0-35之间的一个随机数int rand = (int) (Math.random() * chars.length());rands[i] = chars.charAt(rand);}return rands;}//把产生的验证码生成一张图片,并且写入输出流中        //如果传入的输出流是文件输出流,就会在磁盘上生成验证码图片        //如果传入的是网络输出流,则在客户端浏览器显示验证码图片public static String outPutImage(OutputStream sos)throws IOException{int width = 65;// 设置图片的宽度int height = 25;// 设置图片的高度Random random = new Random();//相当于画纸BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);      //得到画笔      Graphics g = image.getGraphics();      //设置背景色 ,rgb三原色,150以上颜色较淡,适合做背景    g.setColor(new Color(200+random.nextInt(50),    200+random.nextInt(50),200+random.nextInt(50)));      //以前面设置的颜色填充我们的画纸    g.fillRect(0,0,width,height);      //设置字体  Tines Nev Roman    g.setFont(new Font("黑体",Font.ITALIC,18));      //随机产生认证码      char[] sRands =generateCheckCode();    for(int i = 0; i < sRands.length; i++){    //设置内容的颜色    g.setColor(new Color(20+random.nextInt(110),        20+random.nextInt(110),20+random.nextInt(110)));         //将认证码画到画纸上        g.drawString(sRands[i]+"",13*i+6,19);    }      //收工,图像生效      g.dispose();      //把图像写到输出流里面,输出图像到页面      ImageIO.write(image,"JPG",sos);    return new String(sRands);}}
-------------------------------后台servlet代码CreateCode.java------------------------------------

package com.code.servlets;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import com.obtk.utils.ImageUtil;public class CreateCode extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {HttpSession session = request.getSession();response.setContentType("image/jpg");ServletOutputStream sos=response.getOutputStream();String sRands=ImageUtil.outPutImage(sos);        sos.close();                //把得到的验证码保存到session中        session.setAttribute("rCode",new String(sRands));  }  }

-------------------------------前端jsp页面Login.jsp------------------------------

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">    <title>用户登录</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"><style type="text/css">    #show{ margin:auto;width:400px;}#showErr{color: red;}.code{ vertical-align: middle;}#imgCode{vertical-align: middle;}</style><script src="DatePicker/WdatePicker.js" type="text/javascript"></script><script type="text/javascript">function changeCode(){var imgTag=document.getElementById("imgCode");var timenow = new Date().getMilliseconds();imgTag.src="CreateCode.do?id="+timenow;  //每一次请求都是一个新的请求}</script></head>  <body><div id="show"><h2>用户登陆</h2><form action="Login.html" method="post">    <table border="1px">    <tr><td>请输入用户名:</td><td><input class="tt" type="text" name="userName" /></td></tr>    <tr><td>请输入密码:</td><td><input class="tt" type="password" name="passWord" /></td></tr>    <tr><td>请输入验证码:</td><td><input class="code" type="text" name="inputCode" />                       <img src="CreateCode.do" id="imgCode" onclick="changeCode();"/></td></tr>    <tr><td>请输入出生日期:</td><td>        <input type="text" name="myDate" onfocus="WdatePicker();" readonly="readonly" /></td></tr>    <tr><td colspan="2" align="center"><input type="submit" value="登陆" />         <input type="reset" value="重置"/></td></tr>    </table></form></div></body></html>
运行效果如图所示:

















原创粉丝点击