实践---java实现生成验证码功能

来源:互联网 发布:淘宝退款率高了怎么办 编辑:程序博客网 时间:2024/06/06 00:11

开始

1.编写验证码图形显示页面

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%><!DOCTYPE html ><html><head><meta charset="UTF-8"><title>图片验证码</title></head><script type="text/javascript" src="js/jQuery1.9.1.js"></script><script type="text/javascript">  //功能为重新加载 function reload(){/*通过document对象的getElementById()方法拿到 id名为 image的变量 *通过url传参  new一个 Date对象传入时间 */document.getElementById("image").src="<%=request.getContextPath() %>/imageServlet?date="+new Date().getTime();//Jquery取元素  $()方式     调用.val()传入" " $("#checkcode").val("");   // 将验证码清空}  //  功能为验证码 function verificationcode(){     //生命一个名为 text的变量          通过Jquery方式取得元素   checkcode的值      $("#元素名").val() var text=$.trim($("#checkcode").val()); // $.post("${pageContext.request.contextPath}/verificationServlet",{op:text},function(data){ data=parseInt($.trim(data)); if(data>0){ $("#span").text("验证成功!").css("color","green"); }else{ $("#span").text("验证失败!").css("color","red"); reload();  //验证失败后需要更换验证码 } }); $("#checkcode").val(""); // 将验证码清空 }</script><body>    验证码:<input type="text" name="checkcode"  id="checkcode"/>  <img  src="<%=request.getContextPath() %>/imageServlet" alt="验证码" id="image" /><a href="javascript:reload();"><label>换一张</label></a><br><input  type="button" value="提交"  onclick="javascript:verificationcode()"><span id="span"></span></body></html>

2.编写图片生成的Servlet

ImageServlet.java

package com.dw.servlet;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;import javax.servlet.http.HttpSession;public class ImageServlet extends HttpServlet {private static final long serialVersionUID = 1L;       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置字符编码为utf-8request.setCharacterEncoding("utf-8");//画图像BufferedImage bfi = new BufferedImage(85,28,BufferedImage.TYPE_INT_RGB);//Graphics g = bfi.getGraphics();//矩形的坐标g.fillRect(0, 0, 85, 28);//验证码字符范围     字符数组存放char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray();//生成随机数Random r = new Random(); //int index;  //StringBufferStringBuffer sb = new StringBuffer(); //保存字符串for(int i=0; i<4; i++){index = r.nextInt(ch.length);//设置颜色//g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));g.setColor(new Color(r.nextInt(200),r.nextInt(100),r.nextInt(200)));//设置字体Font font = new Font("宋体", 30, 28);g.setFont(font);g.drawString(ch[index]+"", (i*20)+2, 25);sb.append(ch[index]);}// 添加噪点    int area = (int) (0.02 * 80 * 25);    for(int i=0; i<area; ++i){        int x = (int)(Math.random() * 80);        int y = (int)(Math.random() * 25);        bfi.setRGB(x, y, (int)(Math.random() * 250));    }  //设置验证码中的干扰线    for (int i = 0; i < 6; i++) {        //随机获取干扰线的起点和终点      int xstart = (int)(Math.random() * 80);      int ystart = (int)(Math.random() * 25);      int xend = (int)(Math.random() * 80);      int yend = (int)(Math.random() * 25);      g.setColor(interLine(1, 200));      g.drawLine(xstart, ystart, xend, yend);    }        HttpSession session = request.getSession();  //保存到session    session.setAttribute("verificationCode", sb.toString());    ImageIO.write(bfi, "JPG", response.getOutputStream());  //写到输出流}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request,response);}/**   * 获取随机的颜色值,r,g,b的取值在Low到High之间   * @param L 左区间   * @param R 右区间   * @return 返回随机颜色值   */  private static Color interLine(int Low, int High){    if(Low > 255)    Low = 255;    if(High > 255)    High = 255;    if(Low < 0)    Low = 0;    if(High < 0)    High = 0;    int interval = High - Low;     int r = Low + (int)(Math.random() * interval);    int g = Low + (int)(Math.random() * interval);    int b = Low + (int)(Math.random() * interval);    return new Color(r, g, b);  }}

3.验证码的逻辑验证Servlet

Ve'rificationServlet.java

package com.dw.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class VerificationServlet extends HttpServlet {//生成序列化idprivate static final long serialVersionUID = 1L;       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置字符编码为utf-8response.setCharacterEncoding("utf-8");//设置内容类型  为html   编码格式为utf-8response.setContentType("text/html;charset=utf-8");//通过request对象的getSession()得到session对象     赋值给    HttpSession类型的实例化对象   session  HttpSession session =request.getSession();//从session对象 拿到  名称为verificationCode变量的  字符串类型的 变量String verificationCode = (String)session.getAttribute("verificationCode");//验证码  对象String checkcode = request.getParameter("op");//打印输出字符流                PrintWriter out = response.getWriter();if(checkcode.equals(verificationCode)){out.println(1);}else{out.println(0);}//刷新输出流out.flush();//关闭输出流out.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}}



4.web.xml中配置

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  <display-name>verification_code</display-name>    <servlet>                    <!-- 图像Servlet -->  <servlet-name>ImageServlet</servlet-name>  <servlet-class>com.dw.servlet.ImageServlet</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>ImageServlet</servlet-name>  <!-- 处理的url路径为  相对路径    以/imageServlet开始的 所有请求 -->  <url-pattern>/imageServlet</url-pattern>  </servlet-mapping>      <servlet>                     <!-- 验证Servlet -->  <servlet-name>VerificationServlet</servlet-name>  <servlet-class>com.dw.servlet.VerificationServlet</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>VerificationServlet</servlet-name>    <url-pattern>/verificationServlet</url-pattern>  </servlet-mapping>                  <!-- 欢迎页      -->  <welcome-file-list>    <welcome-file>index.html</welcome-file>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list></web-app>

结果:


什么都不输入


输入看到的字符




总结:

以上   验证码生成以及验证功能




总结

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 dnf电脑配置低怎么办 淘宝直播粉丝不够怎么办 电脑页面显示不全怎么办 脸上发痒长痘怎么办 扣扣魔性表情泡泡消失怎么办 脚起小泡泡很痒怎么办 孕妇脚痒起水泡怎么办 孕妇手脚起湿疹怎么办 嘴巴破皮了怎么办 小便刺痛阴唇红肿怎么办 集成墙面挂照片怎么办 苹果电脑网页游戏打不开怎么办 苹果6plus发热怎么办 玩手游手机太卡怎么办 苹果七发烫厉害怎么办 苹果手机延迟高怎么办 王者荣耀总是卡怎么办 王者荣耀卡屏怎么办 王者荣耀网络延迟怎么办 荣耀8手机卡了怎么办 荣耀v10有点卡怎么办 荣耀10有点卡怎么办 8g内存吃鸡会崩怎么办 玩看门狗很卡怎么办 拼多多人数不够怎么办 玩cf想吐怎么办 玩手机头晕恶心怎么办 玩手机头疼恶心怎么办 看手机想吐怎么办 英雄联盟取名后怎么办 王者荣耀改名重复怎么办 刺激战场改名重复怎么办 省钱快报忘记密码怎么办 手机直播网速卡怎么办 触手tv直播黑屏怎么办 酷狗id密码忘记怎么办 打游戏网络不稳定怎么办 电脑打字法没了怎么办 家庭版密钥专业版系统怎么办 win7应用程序不能启动怎么办 win7用户密码忘记了怎么办