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> <input type="submit" value="注册" /></td> </tr> </table> </form></body></html>
4、效果图
0 0
- Servlet学习笔记--生成网站表单验证码
- 【Servlet笔记】servlet 代码生成验证码
- 用Servlet生成图片在表单中生成验证码
- servlet学习五--通过Servlet生成验证码图片
- servlet生成验证码
- servlet生成验证码
- servlet生成验证码
- Servlet 生成验证码
- Servlet 生成 验证码
- servlet生成验证码
- servlet生成验证码
- Servlet生成验证码
- servlet生成验证码
- servlet生成验证码
- servlet生成验证码
- servlet验证码生成
- Servlet生成验证码
- 20160406servlet学习笔记验证码
- 学生成绩同一行显示或者课程安排按照一周星期的显示
- 小用hibernate二级缓存
- Hibernate常见错误
- Spark-IDEA源码阅读环境搭建(Windows)
- UI2_UILabel
- Servlet学习笔记--生成网站表单验证码
- hibernate.cfg.xml配置文件和hbm.xml配置文件
- 前台超出多少字省略号显示
- 项目开发
- Toolbar,DrawerLayout,PagerSlidingTabStrip 草丛三基友实现常规home页面
- 第三周 项目四 顺序表的应用
- iOS项目中全局变量的定义与使用
- CentOS 6.3 32位静默安装Oracle 11g r2详细教程
- VS2013 中IntelliSense: "const char *" 类型的实参与 "LPCWSTR" 类型的形参不兼容