Servlet学习笔记--生成网站表单验证码

来源:互联网 发布:苹果手机安装不了淘宝 编辑:程序博客网 时间:2024/04/30 13:25

一、知识点
1、原理:要生成验证码,一般是首先生成随机字符串,然后将随机字符串描绘成图片的形式输出。
2、验证码的作用:参考:http://zhidao.baidu.com/link?url=WXmjEr4b-Xh5ps8Yv-8A3r0EK5dE8jh0G52U-kEh6McHcMchquHFfsOX1AchvImkoWNB8nUny9o3Nv0GTfFtha 。
3、可以在表单中使用<img>标签的src属性来调试ValidateCodeServlet类来生成验证码,src属性中的值对应的是类名。例子:<img src="ValidateCodeServlet" />

二、例子代码
1、ValidateCodeServlet.java

package com.code;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ValidateCodeServlet extends HttpServlet {    private static final long serialVersionUID = -7949003651752048970L;    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //禁止页面缓存        response.setHeader("Pragma", "No-cache");        response.setHeader("Cache-Control", "No-cache");        response.setDateHeader("Expires", 0);        response.setContentType("image/jpeg");//设置相应正文的MIME类型为图片        int width = 65;        int height = 25;        /* 创建一个位于缓存中的图片,宽度为65,高度为20*/        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);        Graphics g = image.getGraphics();//获取用于处理图形上下文的对象,相当于画笔        Random random = new Random();//创建生成随机数的对象        g.setColor(getRandomColor(180,250));//设置图像的背景色        g.fillRect(0,0,width,height);//画一个矩形,坐标为(0,0),宽度为width,高度为height        g.setFont(new Font("Times New Roman", Font.PLAIN, 23));//设定字体格式        for (int i = 0; i < 150; i++) {//产生150条随机干扰线            int x = random.nextInt(width);            int y = random.nextInt(height);            int xl = random.nextInt(12);            int yl = random.nextInt(12);            g.drawLine(x, y, xl, yl);//在图像的坐标(x,y)和坐标(x+xl, y+yl)之间画干扰线        }        String strCode = "";//定义一个字符串,用于保存此次生成的验证码        for(int i=0; i<4; i++){            String strNumber = String.valueOf(random.nextInt(10));//随机产生一个小于10的数,并转化为string型            strCode += strNumber;            g.setColor(new Color(15+random.nextInt(120) , 15+random.nextInt(120) , 15+random.nextInt(120)));//设置字体的颜色            g.drawString(strNumber, 13*i+6, 20);//依次将验证码画到图画上,坐标为(x=13*i+6 , y=20)        }        request.getSession().setAttribute("code", strCode);//将验证码保存到session中        g.dispose();//释放此图像的上下文以及它使用的所有系统资源        ImageIO.write(image, "JPEG", response.getOutputStream());//输出JPEG格式的图像        response.getOutputStream().flush();//刷新输出流        response.getOutputStream().close();//关闭输出流    }    /*获取随机颜色方法*/    private Color getRandomColor(int fc, int bc) {//fc为前景色;bc为背景色         Random random = new Random();        Color randomColor = null;        if(fc > 255) fc = 255;        if(bc > 255) bc = 255;        int red = random.nextInt(bc - fc);//设置0~255之间的随机数        int green = random.nextInt(bc - fc);        int blue = random.nextInt(bc - fc);        randomColor = new Color(red,green,blue);        return randomColor;//返回具有指定红色、绿色和蓝色值的不透明的sRGB颜色    }}

2、在web.xml中配置ValidateCodeServlet

  <servlet>    <servlet-name>ValidateCodeServlet</servlet-name>    <servlet-class>com.code.ValidateCodeServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>ValidateCodeServlet</servlet-name>    <url-pattern>/ValidateCodeServlet</url-pattern>  </servlet-mapping>

3、index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";request.setCharacterEncoding("utf-8");%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>My JSP 'index.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">    <script type="text/javascript">          function myReload(){              document.getElementById("createCheckCode").src=document.getElementById("createCheckCode").src + "?nocache="+new Date().getTime();          }      </script>  </head><body>    <form action="RegServlet" method="post" onsubmit="return reg(this);">        <table align="center">            <tr>                <td>用户ID</td>                <td><input type="text" name="userID" /></td>            </tr>            <tr>                <td>用户姓名</td>                <td><input type="text" name="username" /></td>            </tr>            <tr>                <td>密码</td>                <td><input type="password" name="password" /></td>            </tr>            <tr>                <td>验证码</td>                <td><img id="createCheckCode" src="ValidateCodeServlet" /> <a href="" onClick="myReload()">看不清,换一个</a></td>            </tr>            <tr>                <td>输入验证码</td>                <td><input type="text" name="code"/></td>            </tr>            <tr>                <td><input type="reset" value="重置" /></td>                <td>&nbsp;<input type="submit" value="注册" /></td>            </tr>        </table>    </form></body></html>

4、效果图
这里写图片描述

0 0
原创粉丝点击