Java Web(四) 一次性验证码的代码实现

     其实实现代码的逻辑非常简单,真的超级超级简单。

     1、在登录页面上login.jsp将验证码图片使用标签<img src="xxx">将绘制验证码图片的url给它

     2、在服务器端就两个servlet,一个就是用来绘制验证码图片的VerifyCodeServlet,另一个就是登录时验证验证码是否点写正确或是否重复提交的LoginServlet

     3、在VerifyCodeServlet中,将验证码的四个字母存入session中,然后在LoginServlet中,将请求中提交过来的验证码与session中的进行对比,如果正确,则验证成功,并且将session中的验证码删除,为什么要删除?保证session中的数据只能被用一次,防止重复提交数据,如果不正确,就使用request,将错误信息保存,然后请求转发到登录页面显示错误信息,如果发现session中的数据为null,说明重复提交了数据,也将错误信息用同样的方法返回到登录页面。

     难点就在于:VerifyCodeServlet的代码实现.对绘图的代码不是很熟悉。

login.jsp

  <body>
            <%
        String msg = (String)request.getAttribute("msg");
        if(msg != null){
            out.print(msg);
        }
    %>

    <form action="/test01/LoginServlet" method="post">
        用户名:<input type="text" name="username" /> <br/>
        验证码:<input type="text" name="verifyCode" size="5" /> <img src="/test01/VerifyCodeServlet" /> <br/>
        <input type="submit" value="提交"/>
    </form>
  </body>

VerifyCodeServlet.java

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

         //声明验证码
        int width = 60;
        int height = 30;
        String data = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghijklmnpqrstuvwxyz";    //随机字符字典,其中0,o,1,I 等难辨别的字符最好不要
        Random random = new Random();//随机类
        //1 创建图片数据缓存区域(核心类)
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//创建一个彩色的图片
        //2 获得画板(图片,ps图层),绘画对象。
        Graphics g = image.getGraphics();
        //3 选择颜色,画矩形3,4步是画一个有内外边框的效果
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, width, height);
        //4白色矩形
        g.setColor(Color.WHITE);
        g.fillRect(1, 1, width-2, height-2);

        /**1 提供缓存区域,为了存放4个随机字符,以便存入session */
        StringBuilder builder = new StringBuilder();

        //5 随机生成4个字符
                    //设置字体颜色
        g.setFont(new Font("宋体", Font.BOLD&Font.ITALIC, 20));
        for(int i = 0 ; i < 4 ;i ++){
            //随机颜色
            g.setColor(new Color(random.nextInt(255),random.nextInt(255), random.nextInt(255)));

            //随机字符
            int index = random.nextInt(data.length());
            String str = data.substring(index, index + 1);

            /**2 缓存*/
            builder.append(str);

            //写入
            g.drawString(str, (width / 6) * (i + 1) , 20);
        }
        //给图中绘制噪音点,让图片不那么好辨别
        for(int j=0,n=random.nextInt(100);j<n;j++){
            g.setColor(Color.RED);
            g.fillRect(random.nextInt(width),random.nextInt(height),1,1);//随机噪音点
        }

        /**3 获得随机数据,并保存session*/
        String tempStr = builder.toString();
        request.getSession().setAttribute("sessionCacheData",tempStr);

        //.. 生成图片发送到浏览器 --相当于下载
        ImageIO.write(image, "jpg", response.getOutputStream());
    }

LoginServlet.java

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //1 获得用户输入的验证码
        String verifyCode = request.getParameter("verifyCode");
        //2 获得服务器session 存放数据 ,如果没有返回null
        String sessionCacheData = (String) request.getSession().getAttribute("sessionCacheData");
        // *将服务器缓存session数据移除
        request.getSession().removeAttribute("sessionCacheData");
        // ** 判断服务器是否存在
        if(sessionCacheData == null){
            request.setAttribute("msg", "请不要重复提交");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
            return;
        }
        //3 比较
        if(! sessionCacheData.equalsIgnoreCase(verifyCode)){
            //用户输入错误
            // * 存放request作用域
            request.setAttribute("msg", "验证码输入错误");
            // * 请求转发
            request.getRequestDispatcher("/login.jsp").forward(request, response);

            return;
        }

        //...... 登录操作

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);
    }

}

效果图:

    

    验证码错误时:

      

注意:

    如果要拷贝代码的话,需要改就应该就是那几处url,你的肯定跟我的不一样,并且有些人设置的servlet的访问路径也不一样,所以拷贝的话只需要拷贝关键代码即可。

  

时间: 2024-08-06 03:46:14

Java Web(四) 一次性验证码的代码实现的相关文章

JAVA web四种属性范围总结

首先必须要了解客户端跳转和服务器端跳转的区别: 客户端跳转: response.sendRedict(String path),地址栏发生改变.不能传递request属性. 服务器端跳转:<jsp:forward> 地址栏不发生改变.能传递request属性. request属性范围: 只有在服务器端跳转以后,所有设置的内容才会停留下来. session属性范围:  不管是客户端跳转还是服务器端跳转,只要是是属性设置了都可以取得. 1:page:(pageContext) 只在一个页面中保存属

java web中图片验证码功能实现

用户在注册网站信息的时候基本上都要数据验证码验证.那么图片验证码功能该如何实现呢? 大概步骤是: 1.在内存中创建缓存图片 2.设置背景色 3.画边框 4.写字母 5.绘制干扰信息 6.图片输出 废话不多说,直接上代码 package com.lsgjzhuwei.servlet.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buffer

与阿根廷一起学习Java Web四个发展:对于信息传输和信息传输

发送短信和通用身份验证和用户注册系统消息提示功能模块,但是实现代码过于复杂.使用JSPGen后,深深发送消息.SMS程序包使复杂的简单非常活跃. 在短信模块:支持两种模式,它们被发送到第三方.地方平台发送,方式(採用本地平台发送时无需进行配置,依据短信发送接口文件重写相应实现类就可以). 一.基础配置 jspgen-config.xml 在框架基础配置文件里,找到mail节点及sms节点,按例如以下配置: <!-- 邮件服务 --> <mail status="true&quo

Java Web项目中的经典代码抽取

前言: 众所周知的,项目开发中做得最多的无非就是增删查改(CRUD)操作.自从国内Web项目开发渐渐盛行SSH框架之后,其开发开发流程也变得更加灵活:本文就项目开发中的业务层代码作个简单的抽取,供业内朋友参考. 代码抽取原理图如下: 这个图主要展示开发中的2个业务,账号(Account)管理跟类别(Category)管理,具体代码实现比较简单就不附上了.从上面的UML图中我们只需要抽象出BaseService接口并且实现BaseServiceImpl类,其他业务的实现一概继承BaseServic

java web 网上零食商城后端代码

(1).dao层: //user package com.skeyedu.mall.dao.user; import java.util.List; import com.skeyedu.mall.dao.IBaseDao; import com.skeyedu.mall.entity.User; import com.skeyedu.mall.param.UserParam; public interface UserDao extends IBaseDao { User findByLogi

Java Web开发入门之Servlet代码篇(三)

1. ServletConfig获取参数&测试实例化/初始化/销毁方法 public class Servlet01_ServletConfig extends HttpServlet { public Servlet01_ServletConfig() { System.out.println("实例化~~~~~~~~~~"); } @Override public void init() throws ServletException { System.out.printl

java web(四)文件上传与下载

一.文件上传原理 1.在TCP/IP中,最早出现的文件上传机制是FTP ,它是将文件由客户端发送到服务器的标准机制:但是在jsp使用过程中不能使用FTP方法上传文件,这是由jsp运行机制所决定. 通过为表单元素设置 method="post" enctype="multipart/form-data" 属性 ,让表单提交的数据以二进制编码的方式提交,在接受此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传. 2.表单encty

java web 网上零食商城前端代码

(1).index.jsp <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <!DOCTYPE html PU

java web 程序---注册页面核心代码哈希Map

收获:在运行程序的时候,错误出现.主要是map没有进行判断,是否为空,如果为空,则创建一个对象new HashMap(); 然后就注意细节, ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 String name=request.getParameter("name");         String pass=request.getParameter("pass");         HashMap map=(HashMap