版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 Servlet仿CSDN动态验证码的生成-带数字和字母一、实现的思路:(1)首先,需要创建一个Servlet。该Servlet通过字节型响应给客户端返回一个图片,该图片是通过JDK中Java 2D的类库来生成一个图片。图片的生成是依靠一个随机数来完成,然后将这个随机数写成图片格式。最后在Session将这个随机的字符串的状态保持住,以便在用户填写后进行对比。 (2)其次,在需要加入验证码的JSP页面中,通过<img src="生成验证码图片的URI"/>引入该图片。 (3)最后,单用户填写完验证码后,提交到某一个Servlet中。在这个Servlet中,通过r
2、equest.getParameter()方法获取用户添加的验证码,然后取出后与Session中生成的验证码进行对比,如果对比成功就表示通过,否则返回该页面给用户提示验证码错误的信息。(4)然后如果要仿CSDN动态验证码,就要分别生成数字和符号(+,-,*),根据符号,计算结果,计算中文,把结果存储到一个List<String>中去。先来看看效果:二、代码这里首先实现只有数字和字母的,还不带符号运算项目一下载1、工程整体结构 2、生成带数字和图片的代码AuthCode.Javajava view plain copypackage com.mucfc; import java.aw
3、t.Color; import java.awt.Graphics; import java.awt.Font; import java.awt.image.BufferedImage; import java.util.Random; /* * 生成验证码图片 * author 林炳文Evankaka(博客: * since 2015.6.22 */ public class AuthCode public static final int AUTHCODE_LENGTH = 5; / 验证码长度 public static final int SINGLECODE_WIDTH = 15;
4、/ 单个验证码宽度 public static final int SINGLECODE_HEIGHT = 30; / 单个验证码高度 public static final int SINGLECODE_GAP = 4; / 单个验证码之间间隔 public static final int IMG_WIDTH = AUTHCODE_LENGTH * (SINGLECODE_WIDTH + SINGLECODE_GAP); public static final int IMG_HEIGHT = SINGLECODE_HEIGHT; public static final char CHAR
5、S = '0','1', '2', '3', '4', '5', '6', '7', '8', '9','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
6、 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
7、'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ; static Random random = new Random(); /* * 返回图片中的数字 * return String */ public static String
8、getAuthCode() StringBuffer buffer = new StringBuffer(); for (int i = 0; i < 5; i+) / 生成6个字符 buffer.append(CHARSrandom.nextInt(CHARS.length); return buffer.toString(); /* * 返回带数字的图片 * return BufferedImage */ public static BufferedImage getAuthImg(String authCode) / 设置图片的高、宽、类型 / RGB编码:red、green、bl
9、ue BufferedImage img = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_BGR); / 得到图片上的一个画笔 Graphics g = img.getGraphics(); / 设置画笔的颜色,用来做背景色 g.setColor(Color.RED); / 用画笔来填充一个矩形,矩形的左上角坐标,宽,高 g.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT); / 将画笔颜色设置为黑色,用来写字 g.setColor(Color.BLACK); / 设置字体:宋体、不带
10、格式的、字号 g.setFont(new Font("宋体", Font.PLAIN, SINGLECODE_HEIGHT + 5); / 输出数字 char c; for (int i = 0; i < authCode.toCharArray().length; i+) / 取到对应位置的字符 c = authCode.charAt(i); / 画出一个字符串:要画的内容,开始的位置,高度 g.drawString(c + "", i * (SINGLECODE_WIDTH + SINGLECODE_GAP) + SINGLECODE_GAP
11、/ 2, IMG_HEIGHT); Random random = new Random(); / 干扰素 for (int i = 0; i < 15; i+) int x = random.nextInt(IMG_WIDTH); int y = random.nextInt(IMG_HEIGHT); int x2 = random.nextInt(IMG_WIDTH); int y2 = random.nextInt(IMG_HEIGHT); g.drawLine(x, y, x + x2, y + y2); return img; 在这里还可以自己更改图片的背景色、验证码的个数、干
12、扰素强度等,有兴趣的同学自己好好设置下吧3、生成动态验证码的servletgetAuthCodeServlet.javajava view plain copypackage com.mucfc; import java.io.IOException; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servle
13、t.http.HttpServletResponse; /* * 得到生成验证码图片的servlet * author 林炳文Evankaka(博客: * since 2015.6.22 */ public class getAuthCodeServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException String authCode = AuthCode.getAuthCode
14、(); request.getSession().setAttribute("authCode", authCode); /将验证码保存到session中,便于以后验证 try /发送图片 ImageIO.write(AuthCode.getAuthImg(authCode), "JPEG", response.getOutputStream(); catch (IOException e) e.printStackTrace(); public void doPost(HttpServletRequest request, HttpServletRes
15、ponse response) throws ServletException, IOException doGet(request,response); 4、index调用,并进行输入正确的判断html view plain copy<% page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getSch
16、eme()+":/"+request.getServerName()+":"+request.getServerPort()+path+"/" %> <!DOCTYPE HTML PUBLIC "-/W3C/DTD HTML 4.01 Transitional/EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp'
17、 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="
18、;keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!- <link rel="stylesheet" type="text/css" href="styles.css"> -> </head> <body> <form action="index.jsp" method
19、="post"> <img src="servlet/GetAuthCodeServlet" id="authImg"/><a href="#" onClick="window.location.reload()">看不清</a><br> <input type="text" name="inputCode"> <% String inputCode = (String)request
20、.getParameter("inputCode"); String authCode = (String)session.getAttribute("authCode"); if(inputCode!=null) if(authCode.equalsIgnoreCase(inputCode) out.print("验证码正确!"); else out.print("验证码错误!请重新输入!"); %> <br> <input type="submit" value=&q
21、uot;提交"> </form> </body> </html> 这里在直接都在一个jsp中判断了5、web.xml设置html view plain copy<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns=" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocatio
22、n=" <servlet> <servlet-name>getAuthCodeServlet</servlet-name> <servlet-class>com.mucfc.getAuthCodeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>getAuthCodeServlet</servlet-name> <url-pattern>/servlet/GetAuthCodeSer
23、vlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file
24、>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app> 6、运行效果三、仿CSDN动态验证码实现整个工程结构不变,项目二下载1、AuthCode改成如下java view plain copypackage com.mucfc; import java.awt.Color; import java.awt.Graphics; import java.awt.Font; import j
25、ava.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import java.util.Random; /* * 生成验证码图片 * author 林炳文Evankaka(博客: * since 2015.6.22 */ public class AuthCode public static final int AUTHCODE_LENGTH = 5; / 验证码长度 public static final int SINGLECODE_WIDTH = 20; / 单个验证码宽度 publ
26、ic static final int SINGLECODE_HEIGHT = 30; / 单个验证码高度 public static final int SINGLECODE_GAP = 4; / 单个验证码之间间隔 public static final int IMG_WIDTH = AUTHCODE_LENGTH * (SINGLECODE_WIDTH + SINGLECODE_GAP); public static final int IMG_HEIGHT = SINGLECODE_HEIGHT; public static final char CHARS = '0'
27、;,'1', '2', '3', '4', '5', '6', '7', '8', '9' ; public static final char OPERATION='+','-','*' static Random random = new Random(); /* * 返回图片中的数字 * return String */ public static List<String> getAut
28、hCode() char char1 = CHARSrandom.nextInt(CHARS.length); char char2 = CHARSrandom.nextInt(CHARS.length); char opt = OPERATIONrandom.nextInt(OPERATION.length); StringBuffer buffer = new StringBuffer(); buffer.append(char1); buffer.append(getOperation(opt); buffer.append(char2); String result=getResult
29、(char1,char2,opt); List<String> list=new ArrayList<String>(); list.add(buffer.toString(); list.add(result); return list; /* * 返回计算的结果 * param operation * return String */ public static String getResult(char char1,char char2,char operation) int int1 = Integer.parseInt(String.valueOf(char1
30、); int int2 = Integer.parseInt(String.valueOf(char2); if('+'=operation) return String.valueOf(int1+int2); else if ('-'=operation) return String.valueOf(int1-int2); else if ('*'=operation) return String.valueOf(int1*int2); else return null; /* * 返回符号对应的中文 * param operation * r
31、eturn String */ public static String getOperation(char operation) if('+'=operation) return "加上" else if ('-'=operation) return "减去" else if ('*'=operation) return "乘以" else return null; /* * 返回带数字的图片 * return BufferedImage */ public static Buffer
32、edImage getAuthImg(String authCode) / 设置图片的高、宽、类型 / RGB编码:red、green、blue BufferedImage img = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_BGR); / 得到图片上的一个画笔 Graphics g = img.getGraphics(); / 设置画笔的颜色,用来做背景色 g.setColor(Color.YELLOW); / 用画笔来填充一个矩形,矩形的左上角坐标,宽,高 g.fillRect(0, 0, IMG_WI
33、DTH, IMG_HEIGHT); / 将画笔颜色设置为黑色,用来写字 g.setColor(Color.BLACK); / 设置字体:宋体、不带格式的、字号 g.setFont(new Font("宋体", Font.PLAIN, SINGLECODE_HEIGHT + 5); / 输出数字 char c; for (int i = 0; i < authCode.toCharArray().length; i+) / 取到对应位置的字符 c = authCode.charAt(i); / 画出一个字符串:要画的内容,开始的位置,高度 g.drawString(c + "", i * (SINGLECODE_WIDTH + SINGLECODE_GAP) + SINGLECODE_GAP / 2, IMG_HEIGHT); Random random = new Random(); / 干扰素 for (int i = 0; i < 5; i+) int x = random.nextInt(IMG_WIDTH); int y = ra
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 我国侵权责任制度
- 打包及岗位责任制度
- 执纪办案安全责任制度
- 承诺责任制度
- 拼装部安全生产责任制度
- 接访五包责任制度
- 收费站疫情防控责任制度
- 政府档案员岗位责任制度
- 教师24小时责任制度
- 教育均衡领导责任制度
- 2026年及未来5年市场数据中国旅游食品行业发展运行现状及发展趋势预测报告
- 2026年商业银行支行行长竞聘管理能力面试问题含答案
- 2025年湖南中烟考试笔试及答案
- 2025-2026学年教科版(新教材)小学科学三年级下册(全册)课时练习(附目录)
- 主题一 学生实验 化学实验基本操作(课件)-【中职专用】高中化学同步课堂(高教版2023·农林牧渔类)
- 2026年度交通运输部所属事业单位第三批统一公开招聘参考考试试题及答案解析
- 安全环保检查表(样表)
- 雨课堂学堂在线学堂云商务英语翻译(Business English Translation Interpretation)西北工业大学单元测试考核答案
- 分众化健康传播:不同人群的科普策略
- 高值耗材销售管理制度(3篇)
- 2025年甘肃省平凉市崆峒区上杨回族乡新庄湾村招聘行政村村文书备考题库及答案详解(全优)
评论
0/150
提交评论