利用servlet生成简单的验证码
- 格式:doc
- 大小:38.00 KB
- 文档页数:3
近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限,还请大家见谅!一:首先上几张案例截图,以便大家可以了解一下短信验证码的流程,这里我在做的过程中也参考了很多网站的短信验证码,比如:58同城,汽车之家等。
1.点击获取验证码之前的样式:2.输入正确的手机号后点击获取验证码之后的样式:3.如果手机号已经被注册的样式:4.如果一个手机号一天发送超过3次就提示不能发送:二:前台的注册页面的代码:reg.jsp<%@page language="java"import="java.util.*"pageEncoding="UTF-8"%> <%@taglib prefix="s"uri="/struts-tags"%><%@page import=".csrc.base.action.FindAllData"%><%String path=request.getContextPath();String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML4.01Transitional//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"><meta http-equiv="description"content="This is my page"><link rel="shortcut icon"type="image/x-icon"href="<%=request.getContextPath()%>/imag es/favicon.ico"/><link rel="stylesheet"type="text/css"href="<%=request.getContextPath()%>/css/main.css"><linkhref="<%=request.getContextPath()%>/formValidator1/style/validator.css"rel="stylesheet"type="text/css"/><style type="text/css">button{background:#F0F0F0repeat-x;padding-top:3px;border-top:1px solid#708090;border-right:1px solid#708090;border-bottom:1px solid#708090;border-left:1px solid#708090;width:auto;line-height:12pt;font-size:10pt;cursor:hand;font-size:10pt;border-top:1px solid#708090;}</style><script src="<%=request.getContextPath()%>/js/jquery-1.7.2.min.js"type="text/javascript"></script><script src="<%=request.getContextPath()%>/formValidator1/formValidator-4.0.1.js" type="text/javascript"></script><script src="<%=request.getContextPath()%>/formValidator1/formValidatorRegex.js" type="text/javascript"></script><script src="<%=request.getContextPath()%>/js/register.js"type="text/javascript"></script><script src="<%=request.getContextPath()%>/js/sms.js"type="text/javascript"></script><script type="text/javascript">function changeCheckNum(){var checkNumImage_=document.getElementById("checkNumImage");checkNumImage_.src="${pageContext.request.contextPath}/image.jsp?timeStamp= "+new Date().getTime();}</script><script type="text/javascript">var msg="${message}";if(msg!=""){alert(msg);}</script></head><body><%@include file="/statics/top.jspf"%><div class="center_division"><div class="center_body"><div class="center_menu"><font color="#000000">当前位置:</font><a href="<%=request.getContextPath()%>/statics/reg.jsp"><font color="#000000">用户注册</font></a></div></div><div class="center_body_menu"><s:form action="RegisterAction_register"id="form1"name="form1"method="post" namespace="/"><table id="tb"><tr><td colspan="3"align="center"bgcolor="#DDDFE1">举报人基本信息</td></tr><tr><td align="center"width="30%"><img src="images/new_reg_xing.gif"/>用户名:</td><td align="center"width="40%"><s:textfield name="username"id="username"cssStyle="width:160px;heigh t:24px;"onblur="checkusername()"/></td><td align="left"width="30%"><span id="usernameTip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:param>username</s:param></s:fielderror></span></td></tr><tr><td align="center"width="30%"><img src="images/new_reg_xing.gif"/>登录密码:</td><td align="center"width="40%"><s:password name="password"id="password"cssStyle="width:160px;heig ht:24px;"onblur="checkpassword()"/></td><td align="left"width="30%"><span id="passwordTip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:param>password</s:param></s:fielderror></span></td></tr><tr><td align="center"width="30%"><img src="images/new_reg_xing.gif"/>确认密码:</td><td align="center"width="40%"><s:password name="passwordRepeat"id="passwordRepeat"cssStyle="wi dth:160px;height:24px;"onblur="checkpasswrodb()"/></td><td align="left"width="30%"><span id="passwordRepeatTip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:param>passwordRepeat</s:param></s:fielderror></span></td></tr><tr><td align="center"width="30%"><img src="images/new_reg_xing.gif"/>姓名:</td><td align="center"width="40%"><s:textfield name="nickname"id="nickname"cssStyle="width:160px;height: 24px;"onblur="checknickname()"/></td><td align="left"width="30%"><span id="nicknameTip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:param>nickname</s:param></s:fielderror></span></td></tr><tr><td align="center"width="30%">性别:</td><td align="center"width="40%"><s:radio list="#application.dataMap.get('10001')"name="jbSex"cssStyle=" height:24px;"/></td><td align="left"width="30%"></td></tr><tr><td align="center"width="30%">联系地址:</td><td align="center"width="40%"><s:textfield name="jbAddress"id="jbAddress"cssStyle="width:160px;heigh t:24px;"/></td><td align="left"width="30%"><span id="jbAddressTip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:param>jbAddress</s:param></s:fielderror></span></td></tr><tr><td align="center"width="30%"><img src="images/new_reg_xing.gif"/>联系手机:</td><td align="center"width="40%"><s:textfield id="jbPhone"name="jbPhone"cssStyle="width:160px;height:24 px;"onblur="checkjbPhone()"/></td><td align="left"width="30%"><span id="jbPhoneTip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:param>jbPhone</s:param></s:fielderror></span></td></tr><tr><td align="center"><img src="images/new_reg_xing.gif"/>短信验证码:</td><td align="left"colspan="2"style="padding-left:112px;"><s:textfield id="SmsCheckCode"name="SmsCheckCode"cssStyle="width: 80px;height:24px;"maxLength="6"/><span><input type="button"id="btnSendCode"name="btnSendCode"valu e="免费获取验证码"onclick="sendMessage()"/></span><span id="SmsCheckCodeTip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:param>SmsCheckCodeTip</s:param></s:fielderror></span></td></tr><tr><td align="center"width="30%"><img src="images/new_reg_xing.gif"/>证件类型:</td><td align="center"width="40%"><s:select list="#application.dataMap.get('10002')"label=""headerKey=""headerValue="--请选择--"value="1"listValue="value"onchange="enableCredentialsCode(this)"name="jbCredentialsName"id="jbCredentialsName"cssStyle="width:160 px;height:24px;"/></td><td align="left"width="30%"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:param>jbCredentialsName</s:param></s:fielderror></td></tr><tr><td align="center"width="30%"><img src="images/new_reg_xing.gif"/>证件号码:</td><td align="center"width="40%"><s:textfield name="jbCredentialsCode"id="jbCredentialsCode"cssStyle="w idth:160px;height:24px;"onblur="checkjbCredentialsCode()"/></td><td align="left"width="30%"><span id="jbCredentialsCodeTip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:param>jbCredentialsCode</s:param></s:fielderror></span></td></tr><tr><td align="center"width="30%">单位名称:</td><s:textfield name="jbCompanyName"id="jbCompanyName"cssStyle="wid th:160px;height:24px;"/></td><td align="left"width="30%"><span id="jbCompanyNameTip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:param>jbCompanyName</s:param></s:fielderror></span></td></tr><tr><td align="center"width="30%"><img src="images/new_reg_xing.gif"/>所在地区:</td><td align="center"width="40%"><s:select list="#application.dataMap.get('10003')"label=""headerKey=""headerValue="--请选择--"listKey="key"cssStyle="width:160px;height:24px;"listValue="value"id="jbSourceArea"name="jbSourceArea"onblur="checkjbSourceArea()"/></td><td align="left"width="30%"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:param>jbSourceArea</s:param></s:fielderror></span></td></tr><tr><td align="center"width="30%"><img src="images/new_reg_xing.gif"/>验证码:</td><td align="center"width="40%"><s:textfield id="checkNum"name="checkNum"cssStyle="width:60px;heigh t:24px;"onblur="checkNumber()"maxLength="4"/><img id="checkNumImage"src="${pageContext.request.contextPath}/imag e.jsp"><a onClick="changeCheckNum()"title="点击换一张"style="cursor:hand;">换一张</a></td><td align="left"width="30%"><span id="checkNumTip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:param>checkNumTip</s:param></s:fielderror></span></td></tr><tr><td colspan="3"style="vertical-align:top;padding-top:5px;padding-bottom:5 px;"><input type="submit"value="注册"style="width:50px;height:24px;"/><input type="reset"value="重置"style="width:50px;height:24px;"/></td></tr></table></s:form></div></div><%@include file="/common/buttom.jspf"%></body></html>三:前台获取短信验证码的js:sms.jsvar InterValObj;//timer变量,控制时间var count=120;//间隔函数,1秒执行var curCount;//当前剩余秒数var code="";//验证码var codeLength=6;//验证码长度function sendMessage(){curCount=count;var jbPhone=$("#jbPhone").val();var jbPhoneTip=$("#jbPhoneTip").text();if(jbPhone!=""){if(jbPhoneTip=="√该手机号码可以注册,输入正确"||jbPhoneTip=="√短信验证码已发到您的手机,请查收"){//产生验证码for(var i=0;i<codeLength;i++){code+=parseInt(Math.random()*9).toString();}//设置button效果,开始计时$("#btnSendCode").attr("disabled","true");$("#btnSendCode").val("请在"+curCount+"秒内输入验证码");InterValObj=window.setInterval(SetRemainTime,1000);//启动计时器,1秒执行一次//向后台发送处理数据$.ajax({type:"POST",//用POST方式传输dataType:"text",//数据格式:JSONurl:"UserAction_sms.action",//目标地址data:"jbPhone="+jbPhone+"&code="+code,error:function(XMLHttpRequest,textStatus,errorThrown){},success:function(data){data=parseInt(data,10);if(data==1){$("#jbPhoneTip").html("<font color='#339933'>√短信验证码已发到您的手机,请查收</font>");}else if(data==0){$("#jbPhoneTip").html("<font color='red'>×短信验证码发送失败,请重新发送</font>");}else if(data==2){$("#jbPhoneTip").html("<font color='red'>×该手机号码今天发送验证码过多</font>");}}});}}else{$("#jbPhoneTip").html("<font color='red'>×手机号码不能为空</font>");}}//timer处理函数function SetRemainTime(){if(curCount==0){window.clearInterval(InterValObj);//停止计时器$("#btnSendCode").removeAttr("disabled");//启用按钮$("#btnSendCode").val("重新发送验证码");code="";//清除验证码。
java实现验证码完整版第一步:在web.xml中配置servlet<servlet><servlet-name>ImageServlet</servlet-name><servlet-class>org.servlet.ImageServlet</servlet-class> </servlet><servlet-mapping><servlet-name>ImageServlet</servlet-name><url-pattern>/ImageServlet</url-pattern></servlet-mapping>第二步: ImageServlet 实现import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.farm.web.tool.RandomValidateCode;public class ImageServlet extends HttpServlet {private static final long serialVersionUID = 1L;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("image/jpeg");// 设置相应类型,告诉浏览器输出的内容为图片response.setHeader("Pragma", "No-cache");// 设置响应头信息,告诉浏览器不要缓存此内容response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expire", 0);RandomValidateCode randomValidateCode = new RandomValidateCode();try {randomValidateCode.getRandcode(request, response);// 输出图片方法} catch (Exception e) {e.printStackTrace();}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class RandomValidateCode {public static String validateCode = null;public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";// 放到session中的keyprivate Random random = new Random();private String randString ="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 随机产生的字符串private int width = 80;// 图片宽private int height = 26;// 图片高private int lineSize = 40;// 干扰线数量private int stringNum = 4;// 随机产生字符数量/** 获得字体*/private Font getFont() {return new Font("Fixedsys", Font.CENTER_BASELINE, 18);}/** 获得颜色*/private Color getRandColor(int fc, int bc) {if (fc > 255)fc = 255;if (bc > 255)bc = 255;int r = fc + random.nextInt(bc - fc - 16);int g = fc + random.nextInt(bc - fc - 14);int b = fc + random.nextInt(bc - fc - 18);return new Color(r, g, b);}/*** 生成随机图片*/public void getRandcode(HttpServletRequest request,HttpServletResponse response) {HttpSession session = request.getSession();// BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_BGR);Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作g.fillRect(0, 0, width, height);g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE,18));g.setColor(getRandColor(110, 133));// 绘制干扰线for (int i = 0; i <= lineSize; i++) {drowLine(g);}// 绘制随机字符String randomString = "";for (int i = 1; i <= stringNum; i++) {randomString = drowString(g, randomString, i);}session.removeAttribute(RANDOMCODEKEY);session.setAttribute(RANDOMCODEKEY, randomString);validateCode = randomString.toUpperCase();g.dispose();try {ImageIO.write(image, "JPEG",response.getOutputStream());// 将内存中的图片通过流动形式输出到客户端} catch (Exception e) {e.printStackTrace();}}/** 绘制字符串*/private String drowString(Graphics g, String randomString, int i) {g.setFont(getFont());g.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121)));String rand =String.valueOf(getRandomString(random.nextInt(randString.length())));randomString += rand;g.translate(random.nextInt(3), random.nextInt(3));g.drawString(rand, 13 * i, 16);return randomString;}/** 绘制干扰线*/private void drowLine(Graphics g) {int x = random.nextInt(width);int y = random.nextInt(height);int xl = random.nextInt(13);int yl = random.nextInt(15);g.drawLine(x, y, x + xl, y + yl);}/** 获取随机的字符*/public String getRandomString(int num) {return String.valueOf(randString.charAt(num)); }}第三步:jsp展现<tr><td><div align="right">验证码:</div></td><td><input style="width: 65px" id="validatecode"name="validatecode" type="text" /></td><td><img title="看不清楚,换一张?" style="cursor: pointer;" onclick="javascript:refresh(this);"src="<PF:basePath/>/ImageServlet"></td></tr>src路径根据情况修改function refresh(obj) {obj.src = "<PF:basePath/>/ImageServlet?"+Math.random();}第四步:Action验证if(RandomValidateCode.validateCode!=null&&validatecode.trim().toUpperCa se().equals(RandomValidateCode.validateCode)){System.out.println("验证码正确");}。
servlet生成验证码图片一、BufferedImage类介绍生成验证码图片主要用到了一个BufferedImage类,如下:创建一个DrawImage Servlet,用来生成验证码图片1package gacl.response.study;2import java.awt.Color;3import java.awt.Font;4import java.awt.Graphics;5import java.awt.Graphics2D;6import java.awt.image.BufferedImage;7import java.io.IOException;8import java.util.Random;9import javax.imageio.ImageIO;10import javax.servlet.ServletException;11import javax.servlet.http.HttpServlet;12import javax.servlet.http.HttpServletRequest;13import javax.servlet.http.HttpServletResponse;14/**15* 生成随机图片,用来作为验证码16*/17public class DrawImage extends HttpServlet {18private static final long serialVersionUID = 3038623696184546092L; 1920public static final int WIDTH = 120;//生成的图片的宽度21public static final int HEIGHT = 30;//生成的图片的高度2223public void doGet(HttpServletRequest request, HttpServletResponse response)24throws ServletException, IOException {25this.doPost(request, response);26}2728public void doPost(HttpServletRequest request, HttpServletResponse response)29throws ServletException, IOException {30String createTypeFlag = request.getParameter("createTypeFlag");//接收客户端传递的createTypeFlag 标识31//1.在内存中创建一张图片32BufferedImage bi = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);33//2.得到图片34Graphics g = bi.getGraphics();35//3.设置图片的背影色36setBackGround(g);37//4.设置图片的边框38setBorder(g);39//5.在图片上画干扰线40drawRandomLine(g);41//6.写在图片上随机数42//String random = drawRandomNum((Graphics2D) g,"ch");//生成中文验证码图片43//String random = drawRandomNum((Graphics2D) g,"nl");//生成数字和字母组合的验证码图片44//String random = drawRandomNum((Graphics2D) g,"n");//生成纯数字的验证码图片45//String random = drawRandomNum((Graphics2D) g,"l");//生成纯字母的验证码图片46String random = drawRandomNum((Graphics2D) g,createTypeFlag);//根据客户端传递的createTypeFlag标识生成验证码图片47//7.将随机数存在session中48request.getSession().setAttribute("checkcode", random);49//8.设置响应头通知浏览器以图片的形式打开50response.setContentType("image/jpeg");//等同于response.setHeader("Content-Type","image/jpeg");51//9.设置响应头控制浏览器不要缓存52response.setDateHeader("expries", -1);53response.setHeader("Cache-Control", "no-cache");54response.setHeader("Pragma", "no-cache");55//10.将图片写给浏览器56ImageIO.write(bi, "jpg", response.getOutputStream());57}5859/**60* 设置图片的背景色61* @param g62*/63private void setBackGround(Graphics g) {64// 设置颜色65g.setColor(Color.WHITE);66// 填充区域67g.fillRect(0, 0, WIDTH, HEIGHT);68}6970/**71* 设置图片的边框72* @param g73*/74private void setBorder(Graphics g) {75// 设置边框颜色76g.setColor(Color.BLUE);77// 边框区域78g.drawRect(1, 1, WIDTH - 2, HEIGHT - 2); 79}8081/**82* 在图片上画随机线条83* @param g84*/85private void drawRandomLine(Graphics g) {86// 设置颜色87g.setColor(Color.GREEN);88// 设置线条个数并画线89for (int i = 0; i < 5; i++) {90int x1 = new Random().nextInt(WIDTH); 91int y1 = new Random().nextInt(HEIGHT); 92int x2 = new Random().nextInt(WIDTH); 93int y2 = new Random().nextInt(HEIGHT); 94g.drawLine(x1, y1, x2, y2);95}96}9798/**99* 画随机字符100* @param g101* @param createTypeFlag102* @return103* String... createTypeFlag是可变参数,104* Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。
Java行为验证码1、前言验证码通常是为了区分用户是人还是计算机,也可以预防被解开密码、批量操作等恶意行为,而客户端上多数会用在关键操作上,比如购买、登录、注册等场景。
现在验证码的种类样式也特别多,今天教大家如何用Java做出验证码吧。
2、Java代码package com.kyger;import jakarta.servlet.ServletException;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;import java.util.Map;public class demo extends HttpServlet {private static final long serialVersionUID = 1L;public demo() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 编码request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");;response.setContentType("text/html; charset=utf-8");// 后台处理if (request.getMethod().equals("POST")){String html, appId, appSecret;// 设置AppId 及AppSecret,在应用管理中获取appId = "appID";appSecret = "appSecret";KgCaptchaSDK KgRequest = new KgCaptchaSDK(appId, appSecret);// 前端验证成功后颁发的token,有效期为两分钟KgRequest.token = request.getParameter("kgCaptchaToken");// 填写应用服务域名,在应用管理中获取KgRequest.appCdn = "appCdn";// 请求超时时间,秒KgRequest.connectTimeout = 5;// 用户登录或尝试帐号,当安全策略中的防控等级为3时必须填写,一般情况下可以忽略// 可以填写用户输入的登录帐号(如:request.getParameter("username"),可拦截同一帐号多次尝试等行为erId = "kgCaptchaDemo";// request 对象,当安全策略中的防控等级为3时必须填写,一般情况下可以忽略KgRequest.request = request;// java 环境中无法提供request 对象,请分别定义:clientIp|clientBrowser|domain 参数,即:// KgRequest.clientIp = ""; // 填写客户端IP// KgRequest.clientBrowser = ""; // 客户端浏览器信息// KgRequest.domain = ""; // 你的授权域名或服务IP// 发送验证请求Map<String, String> requestResult = KgRequest.sendRequest();if("0".toString().equals(requestResult.get("code"))) {// 验签成功逻辑处理***// 这里做验证通过后的数据处理// 如登录/注册场景,这里通常查询数据库、校验密码、进行登录或注册等动作处理// 如短信场景,这里可以开始向用户发送短信等动作处理// ...html = "<script>alert('验证通过');history.back();</script>";} else {// 验签失败逻辑处理html = "<script>alert(\"" + requestResult.get("msg") + " - " + requestResult.get("code") + "\");history.back();</script>";}response.getWriter().append(html);} else {response.sendRedirect("index.html");}}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}3、效果如下4、最后以上就是java实现行为验证码的全部内容。
java验证码实现原理Java验证码实现原理验证码(CAPTCHA)是一种用于防止自动化程序攻击的技术。
Java作为一种广泛使用的编程语言,也提供了多种方法来实现验证码功能。
本文将介绍Java验证码的实现原理。
1. 什么是验证码?验证码是一种人机交互技术,通过给用户展示一个难以被计算机识别的图形或文字,要求用户输入正确的答案来验证用户是否为人类。
这种技术主要用于防止自动化程序攻击,例如防止恶意软件通过自动化方式注册大量账号、发送垃圾邮件等。
2. Java中的验证码实现Java中提供了多种方式来实现验证码,例如使用第三方库、使用Java Servlet API等。
下面将分别介绍这些方法的原理。
2.1 使用第三方库在Java中,有很多第三方库可以用于生成和验证验证码。
其中比较流行的有Google的reCAPTCHA和Kaptcha等。
reCAPTCHA是Google开发的一款免费且易于使用的服务,用于保护网站免受垃圾邮件和恶意软件攻击。
它基于先进的机器学习技术,在用户完成简单任务(例如选择图像中所有包含某个物体的图像)后生成一个随机字符串作为验证码,并将其与Google服务器上的预定义答案进行比较。
如果用户输入的答案与预定义答案匹配,则验证通过。
Kaptcha是一种Java验证码库,它可以生成各种验证码,例如数字、字母、中文等。
它使用Java的Graphics2D API在内存中生成验证码图片,并将其输出到客户端。
Kaptcha还提供了多种选项来自定义验证码的样式和行为。
使用第三方库可以方便地实现验证码功能,但需要注意选择合适的库并防止版本兼容性问题。
2.2 使用Java Servlet APIJava Servlet API是Java EE中用于创建Web应用程序的标准API之一。
它提供了一个名为Servlet的接口,开发人员可以通过实现该接口来处理HTTP请求和响应。
在Servlet中实现验证码功能通常有以下几个步骤:1. 生成随机字符串作为验证码,并将其存储在Session中。
数字验证码的开发流程
数字验证码的开发流程主要包括以下几个步骤:
1. 生成验证码:通常使用服务器端技术(如Java的Servlet)生成随机的数字或字符,拼接成一个字符串,存入session域中。
2. 显示验证码:将生成的验证码以图片的形式传送到客户端,展示给用户。
3. 客户端验证:客户端对用户输入的验证码进行简单的规则校验,例如判断验证码是否为空、输入的字符长度是否达到标准等。
4. 提交验证:用户将输入的验证码传送到服务器端,服务器在session中取到存储的验证码值,进行具体的验证判断。
5. 结果处理:根据输入的验证码是否正确,服务器端跳转到相应的界面。
如果输入错误,一般会跳回当前界面,并刷新验证码。
具体实现的页面,比如可以有一个用于生成验证码的Response_3类。
在实际开发中,还可能涉及到前端页面设计和后端代码实现等步骤。
此外,还可以结合Redis等缓存技术来保存验证码,以减轻服务器的压力。
具体的开发流程可能因项目需求和开发环境而有所不同,建议根据实际情况进行调整。
java实现简单的验证码功能最近要做⼀个⽹站,要求实现验证码程序,经过不断调试,终于成功实现功能。
⼀、验证码⽣成类⽣成验证码的话需要⽤到java的Graphics类库,画出⼀个验证码废话不多说,直接上代码package verificationCode;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.awt.image.RenderedImage;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.HashMap;import java.util.Map;import java.util.Random;import javax.imageio.ImageIO;public class generateCode {private static int width = 150;// 定义图⽚的widthprivate static int height = 48;// 定义图⽚的heightprivate static int codeCount = 4;// 定义图⽚上显⽰验证码的个数private static int xx = 25;private static int fontHeight = 42;private static int codeY = 42;private static char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R','S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };/*** ⽣成⼀个map集合* code为⽣成的验证码* codePic为⽣成的验证码BufferedImage对象* @return*/public static Map<String,Object> generateCodeAndPic() {// 定义图像bufferBufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// Graphics2D gd = buffImg.createGraphics();// Graphics2D gd = (Graphics2D) buffImg.getGraphics();Graphics gd = buffImg.getGraphics();// 创建⼀个随机数⽣成器类Random random = new Random();// 将图像填充为⽩⾊gd.setColor(Color.WHITE);gd.fillRect(0, 0, width, height);// 创建字体,字体的⼤⼩应该根据图⽚的⾼度来定。
生成随机的5位登录验证码import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.io.OutputStream;import java.util.Random;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;static String code="";publicclass checkService {publicvoid checkCode(HttpServletRequestreq,HttpServletResponse resp)throws ServletException,IOException{//绘制画布BufferedImage bf=newBufferedImage(80,30,BufferedImage.TYPE_INT_BGR);//获得画笔Graphics g=bf.getGraphics();//给画笔设置颜色g.setColor(new Color(255,255,255));//填充背景色g.fillRect(0, 0, 80, 30);//随机获得前景色Random r=new Random();g.setColor(newColor(r.nextInt(255),r.nextInt(255),r.nextInt(255)));//设置字体Font f=new Font("",Font.BOLD,22);//获得字体g.setFont(f);//以当前颜色和字体绘制干扰线checkService.code=checkService.getstr();g.drawString(checkService.code,10,25);for(int i=0;i<10;i++){g.drawLine(r.nextInt(80), r.nextInt(30), r.nextInt(80), r.nextInt(30));}//将图片按照jpeg算法压缩并发送给浏览器resp.setContentType("image/jpeg");OutputStream out =resp.getOutputStream();javax.imageio.ImageIO.write(bf,"jpeg", out);}//生成随机的字符串验证码publicstatic String getstr(){String str="abcdefghijklmnopqrstuvwxyz0123456789";Random r=new Random();String code="";for(int i=0;i<5;i++){code+=str.charAt(r.nextInt(str.length()));}return code;}}。
先定义一个RandCode类package util;import java.util.Random;public class RandCode {String code="";public RandCode(){Random rand = new Random();Stringtmp="@ABCDEFKLMNPghijkmnopqyz0123rsQRSTUVWXYZabcdeGHI Jftuvwx456789";code="";for(int i=0; i<4; i++){int index = rand.nextInt(tmp.length());code+=tmp.substring(index, index+1);}}public String getCode() {return code;}}在servlet中产生图片RandCode yzm = new RandCode();BufferedImage bi=new BufferedImage(80,30,BufferedImage.TYPE_INT_RGB);Graphics g = bi.getGraphics();g.setColor(new Color(120,200,50));g.setFont(new Font("Tw Cen MT",Font.ROMAN_BASELINE,24));g.fillRect(0, 0, 80, 30);//设置随机验证码字符串g.setColor(Color.blue);g.drawString(yzm.getCode(), 0, 20);//将验证码保存在session对象中request.getSession().setAttribute("yzm",yzm.getCode ());//将生成的图片以jpg格式发送到客户端ImageIO.write(bi,"JPG",response.getOutputStream());在jsp端验证码:<input type="text"name="yzm"><img alt="看不清,单击换一张"src="yzmServlet"onclick="this.src=yzmServlet">提交后验证的servlet//得到用户在输入框输入的验证码String yzmInput=request.getParameter("yzm");//得到随机产生的验证码StringyzmRandom=(String)request.getSession().getAttribute(" yzm");//忽略大小写的比较if(yzmRandom.equalsIgnoreCase(yzmInput)){ //验证码正确跳转到你想要去的地方response.sendRedirect("login.jsp");}else{//验证码错误。
通过Servlet的方式进行登录验证通过Servlet 的方式进行登录验证【JSP】1、首先要定义好servlet的类,比如数据库连接类,数据库操作类,为了在书写jsp页面时调用类的对象方便,建议再写一个工厂类。
如图所示2、另外还要定义几个用于登录验证的业务逻辑类,也就是servlet类,这些类调用工厂中的类,完成数据库的操作。
3、Servlet的类必须继承HttpServlet这个类,而且起码要赋写HttpServlet类中的两个方法,doGet()和doPost ()方法。
两个方法可以互相调用,只需要实现一个方法,然后让另一个方法调用即可。
4、书写登录界面login.jsp文件特别的在form标签的action属性中要写好用来进行处理数据库验证的servlet名称。
当点击submit按钮后,会将表单中的信息(用户名和密码)通过post 的方式提交到action所指向的servlet中。
5、在servlet中进行业务逻辑的处理经过一些if的判断后,如果验证成功,则跳转到子页面content.jsp,如果验证失败,则仍旧跳转回登录页面。
6、必须在项目的web.xml文件中配置这个servlet的映射路径在项目中打开web.xml文件,写入如下图所示的代码Servlet标签中的servlet-name表示的是在服务器程序内部所使用的虚拟servlet名称。
Servlet-class标签中的内容表示的是这个servlet类所在的位置,即包.类名称下面的servlet-mapping是一个映射路径,名称必须和上面的虚拟servlet名称一致,这样程序才会找到这个类所在的包url-pattern表示的是这个servlet对应的页面的路径这样一个简单的servlet架构就搭建完成了。
下面再通过一个流程图来了解一下servlet和jsp的运行过程:。
layui使⽤html+servlet+ajax实现登录验证我们⼀般使⽤的都是form表单提交到Servlet来实现前端和后端的交互的。
这次我使⽤的是ajax提交数据,实现登录操作。
⾸先我们需要的是⼀套layui模板,这⾥⽤到layui的js和css界⾯。
第⼀步⾃⼰建⽴数据表,这⾥只需要username 和password。
我使⽤的是主要使⽤的是mysql。
这边是我的⼯程⽬录,来看⼀下我的⽬录结构吧。
这⾥就主要写⼀下servlet和前端html的交互。
Servletlogin.javapackage com.Serlvet;import er;import com.Dao.mannger;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;import java.io.PrintWriter;@WebServlet(name ="login", value = "/login")public class login extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String action=request.getParameter("action");//action'是html传来的⼀个字段if(action.equals("doLogin")){doLogin(request,response);}}protected void doLogin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");//设置相应的⽂本类型response.setContentType("text/html;charset=utf-8");//设置响应类型,并防⽌中⽂乱码String username = request.getParameter("username");String password = request.getParameter("password");String fangshi = request.getParameter("fangshi");mannger dao = new mannger();//dao层对象User student = new User();//实体类对象User admin = new User();//实体类对象student.setUsername(username);//获取前端传来的数据student.setPassword(password);admin.setUsername(username);admin.setPassword(password);int i = 0;if ("0".equals(fangshi)) { //判断登录⽅式i = dao.loginstu(student); //执⾏登录操作if (i==0) {request.setAttribute("msg", "⽤户名或者密码错误");System.out.println("⽤户名或者密码错误");response.getWriter().print("error"); //响应ajax的data值,} else {System.out.println("ok");response.getWriter().print("ok");//响应ajax的data值,成功则进响应到前端request.getSession().setAttribute("student", student.getUsername());System.out.println("登陆成功");}}else if ("1".equals(fangshi)) {i = dao.loginadmin(admin);System.out.println(i);if (i == 0) {request.setAttribute("msg", "⽤户名或者密码错误");System.out.println("⽤户名或者密码错误");response.getWriter().print("error"); //响应ajax的data值,} else {System.out.println("ok");response.getWriter().print("ok");//响应ajax的data值,成功则进响应到前端request.getSession().setAttribute("student", student.getUsername());System.out.println("登陆成功");}}}}dao层,这个代码是封装的⼀些进⾏数据库操作的⽅法。
标题:深度解析kaptcha servlet使用手册一、介绍在全球信息湾开发过程中,常常会遇到需要使用验证码的情况,以便提高安全性和防止恶意攻击。
Kaptcha是一个可用于生成验证码图像的Java库,其使用方便,功能强大。
本文将从使用手册的角度,深入探讨Kaptcha在Servlet中的使用方法,以帮助开发者更好地了解和应用这一工具。
二、Kaptcha概述1. 什么是Kaptcha?Kaptcha是一个开源的Java库,用于生成验证码图像,支持配置验证码的大小、干扰线程度、字符样式等。
2. 为什么选择Kaptcha?Kaptcha具有简单易用、功能丰富、高度可定制化等特点,适合在Servlet中应用于生成验证码图像。
三、Servlet中使用Kaptcha1. 导入Kaptcha库在项目中引入Kaptcha的jar包,并在web.xml中配置Kaptcha 的Servlet。
2. 配置Kaptcha通过配置Kaptcha的参数,可以定制生成的验证码图像的样式和特点,如验证码大小、字符样式、干扰线程度等。
3. 在Servlet中使用Kaptcha在Servlet中通过调用Kaptcha的API,即可生成验证码图像,并将其输出到HTTP响应中,以便页面展示和用户输入。
四、使用示例1. 示例代码以下是一个简单的Servlet中使用Kaptcha生成验证码图像的代码示例:```java// 初始化KaptchaDefaultKaptcha kaptcha = new DefaultKaptcha();kaptcha.setConfig(new Properties());// 生成验证码图像String text = kaptcha.createText();BufferedImage image = kaptcha.createImage(text);// 输出到HTTP响应response.setContentType("image/jpeg");ServletOutputStream out = response.getOutputStream();ImageIO.write(image, "jpg", out);```五、总结与回顾通过本文的介绍和示例,我们了解了Kaptcha在Servlet中的使用方法。
前端开发实训案例网页验证码的生成与验证前端开发实训案例网页验证码的生成与验证为了保证网页的安全性和防止机器人恶意攻击,很多网站在用户进行注册、登录或者提交表单等操作时会要求用户输入验证码。
验证码是一种基于图像识别的技术,通过生成和验证验证码,可以有效防止机器人的自动化行为,确保用户身份的真实性。
本文将介绍前端开发中实现网页验证码的生成与验证的案例,并提供相应的代码实例。
1. 网页验证码的生成在前端开发中,验证码的生成是通过服务器端应用和前端代码联动来实现的。
以下是一种常见的验证码生成方法:首先,我们需要在服务器端生成验证码图片。
可以使用第三方库、自定义脚本或开源工具来实现这一步骤。
生成验证码图片的关键是要确保图片上的字符是随机的、干扰元素适当,并且字体、大小、颜色等可配置。
接下来,在前端页面中使用<img>标签将验证码图片展示给用户。
同时,在用户填写验证码的输入框旁边提供一个刷新按钮,点击按钮可以重新加载生成新的验证码图片。
2. 网页验证码的验证用户输入验证码后,前端需要将验证码的值发送给服务器端进行验证。
下面是一个网络验证码验证的示例过程:首先,前端需要获取用户输入的验证码值,可以使用JavaScript的相关API来获取。
然后,前端通过AJAX等方式将验证码的值发送给服务器端。
服务器端会将用户输入的验证码值与之前生成的验证码值进行比对。
如果验证码验证成功,服务器端会返回一个验证通过的信息(如JSON格式的数据)给前端;否则,返回一个验证失败的信息。
前端根据服务器端返回的响应,可以展示相应的提示信息给用户,例如验证码正确、验证码错误等提示。
3. 安全性考虑为了保证验证码的安全性,防止机器人攻击,有以下几点需要注意:首先,生成的验证码要足够随机,不能出现重复的情况,且需要有一定复杂度。
可以使用混合字母、数字和特殊字符的组合,增加验证码的难度。
其次,验证码的图片要有适当的干扰元素,使机器无法简单识别。
Java简单验证码原理(源代码+步骤操作)本⽂章⼀共分为五个步骤,具体操作流程如下:⼀、新建名为:CheckCodeServlet的servlet类;⼆、复制以下代码到新建的CheckCodeServlet类中,修改⾃⼰的包名:package com.seesun2012.Servlet; //这⾥是我的包名import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.io.OutputStream;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 CheckCodeServlet extends HttpServlet {//产⽣随即的字体private Font getFont() {//创建random对象⽤来⽣成随机数Random random = new Random();//创建字体数组,⽤来装不同的字体的Font对象Font font[] = new Font[5];font[0] = new Font("Ravie", Font.PLAIN, 24);font[1] = new Font("Antique Olive Compact", Font.PLAIN, 24);font[2] = new Font("Forte", Font.PLAIN, 24);font[3] = new Font("Wide Latin", Font.PLAIN, 24);font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 24);return font[random.nextInt(5)];}protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 设置响应头 Content-type类型resp.setContentType("image/jpeg");OutputStream os = resp.getOutputStream();int width = 83, height = 30;// 建⽴指定宽、⾼和BufferedImage对象BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics(); // 该画笔画在image上Color c = g.getColor(); // 保存当前画笔的颜⾊//填充矩形g.fillRect(0, 0, width, height);// 随即产⽣的字符串不包括 i l(⼩写L) o(⼩写O) 1(数字1)0(数字0)char[] ch = "abcdefghjkmnpqrstuvwxyz2345678901".toCharArray();int length = ch.length; // 随即字符串的长度String sRand = ""; // 保存随即产⽣的字符串Random random = new Random();for (int i = 0; i < 4; i++) {// 设置字体g.setFont(getFont());// 随即⽣成0-9的数字String rand = new Character(ch[random.nextInt(length)]).toString();sRand += rand;// 设置随机颜⾊g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));g.drawString(rand, 20 * i + 6, 25);}//产⽣随即⼲扰点for (int i = 0; i < 20; i++) {int x1 = random.nextInt(width);int y1 = random.nextInt(height);g.drawOval(x1, y1, 2, 2);}// 将画笔的颜⾊再设置回去g.setColor(c);// 释放此图形的上下⽂以及它使⽤的所有系统资源。
利用servlet生成简单的验证码
在web.xml配置:
代码
1.<servlet>
2. <servlet-name>image</servlet-name>
3. <servlet-class>org.test.web.AuthImage</servlet-class>
4.</servlet>
5.
6.<servlet-mapping>
7. <servlet-name>image</servlet-name>
8. <url-pattern>/authImage</url-pattern>
9.</servlet-mapping>
<script>render_code();</script>
其servlet源代码:
代码
1.public class AuthImage extends HttpServlet
2.{
3.
4. private static final String CONTENT_TYPE = "text/html; charset=gb2312";
5. //设置字母的大小,大小
6. private Font mFont = new Font("Times New Roman", Font.PLAIN, 17);
7. public void init() throws ServletException
8. {
9. super.init();
10. }
11. Color getRandColor(int fc,int bc)
12. {
13. Random random = new Random();
14. if(fc>255) fc=255;
15. if(bc>255) bc=255;
16. int r=fc+random.nextInt(bc-fc);
17. int g=fc+random.nextInt(bc-fc);
18. int b=fc+random.nextInt(bc-fc);
19. return new Color(r,g,b);
20. }
21.
22. public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
23. {
24. response.setHeader("Pragma","No-cache");
25. response.setHeader("Cache-Control","no-cache");
26. response.setDateHeader("Expires", 0);
27. //表明生成的响应是图片
28. response.setContentType("image/jpeg");
29.
30. int width=100, height=18;
31. BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_I
NT_RGB);
32.
33. Graphics g = image.getGraphics();
34. Random random = new Random();
35. g.setColor(getRandColor(200,250));
36. g.fillRect(1, 1, width-1, height-1);
37. g.setColor(new Color(102,102,102));
38. g.drawRect(0, 0, width-1, height-1);
39. g.setFont(mFont);
40.
41. g.setColor(getRandColor(160,200));
42.
43. //画随机线
44. for (int i=0;i<155;i++)
45. {
46. int x = random.nextInt(width - 1);
47. int y = random.nextInt(height - 1);
48. int xl = random.nextInt(6) + 1;
49. int yl = random.nextInt(12) + 1;
50. g.drawLine(x,y,x + xl,y + yl);
51. }
52.
53. //从另一方向画随机线
54. for (int i = 0;i < 70;i++)
55. {
56. int x = random.nextInt(width - 1);
57. int y = random.nextInt(height - 1);
58. int xl = random.nextInt(12) + 1;
59. int yl = random.nextInt(6) + 1;
60. g.drawLine(x,y,x - xl,y - yl);
61. }
62.
63. //生成随机数,并将随机数字转换为字母
64. String sRand="";
65. for (int i=0;i<6;i++)
66. {
67. int itmp = random.nextInt(26) + 65;
68. char ctmp = (char)itmp;
69. sRand += String.valueOf(ctmp);
70. g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+rando
m.nextInt(110)));
71. g.drawString(String.valueOf(ctmp),15*i+10,16);
72. }
73.
74. HttpSession session = request.getSession(true);
75. session.setAttribute("rand",sRand);
76. g.dispose();
77. ImageIO.write(image, "JPEG", response.getOutputStream());
78. }
79. public void destroy()
80. {
81. }
82.}
<script>render_code();</script>
怎样用:
在页面显示随机图片,可在JSP页面中增加如下代码即可:
代码
1.<img src="authImage">
From:。