首页 > 编程语言 >Java Web应用设计中验证码的生成和应用方法

Java Web应用设计中验证码的生成和应用方法

时间:2023-04-17 09:34:22浏览次数:42  
标签:Web Java request 验证码 应用 println import response out

  在Java Web应用设计中验证码的设计是一个必不可少的环节,由于验证码技术具有随机性较强、简单的特点,能够在一定程度上阻止网络上的恶意访问,在互联网领域得到了广泛的应用,如防止破解密码、刷票、论坛灌水、刷页、注册等恶意操作。百度上对验证码的定义是:(CAPTCHA)“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。很多Web应用系统或网站在注册登录的时候都需要验证码这个环节,验证码一般是随机产生的,有很大几率会出现无法清楚识别验证码得图片,所以一般都会有相应的提示,如“看不清,换一张”等,如果没有提示,则直接点击当前的验证码图片,就可以完成验证码的更换。

1. 生成验证码的Servlet程序(Servlet程序的Java类名:CheckCode )

package cn.hbqgy.tools;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics2D;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.io.OutputStream;

import java.io.PrintWriter;

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 CheckCode extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        //定义验证码图片的宽和高

        int width = 95;

        int height = 32;

        //创建一个图片缓冲区,作为画布

        BufferedImage image =

                new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        //获取这个“画布”上画图的“画笔”

        Graphics2D g = (Graphics2D) image.getGraphics();

        //设置画笔的颜色背景色

        g.setColor(new Color(0xFAEBD7));

        //使用画笔绘制画布的背景

        g.fillRect(0, 0, width, height);

        //修改画笔颜色为黑色

        g.setColor(Color.black);

        //绘制画布边框

        g.drawRect(0, 0, width - 1, height - 1);

        //创建一个随机数生成对象

        Random r = new Random();

        //定义一个字符数组,作为验证码字符源

        String str="123456789";

        str=str+"qwertyuiopasdfghjklzxcvbnm";

        str=str+str.toUpperCase();

        char[] chars = str.toCharArray();

        // 在图片上生成干扰点

        for (int i = 0; i < 300; i++) {

            g.setColor(new Color(r.nextInt(150) + 50,

                    r.nextInt(150) + 50, r.nextInt(150) + 50));

            int x = r.nextInt(width);

            int y = r.nextInt(height);

            g.drawOval(x, y, 1, 1);

        }

        //创建一个字符串缓冲区,用来保存要输出到图片中的所有字符

        StringBuilder strBuilder = new StringBuilder();

        //循环往图片中写入字符

        for (int i = 0, left = 8; i < 4; i++, left += 21) {

            //从字符源中随机获取一个字符

            char ch = chars[r.nextInt(chars.length)];

            //将字符添加到字符串缓冲区中

            strBuilder.append(ch);

            //设置画笔颜色

            g.setColor(new Color(r.nextInt(100), r.nextInt(100), r.nextInt(100)));

            //设置字符的字体

            g.setFont(new Font("Arial", Font.BOLD, 24));

            //设置一个弧度

            double rot = Math.PI / 360 * (45 - r.nextInt(90));

            //旋转画笔输出的方向,旋转角度为上面获取的角度

            g.rotate(rot, left, height/2);

            //往画布中输出字符

            g.drawString(ch + "", left, 24);

            //将画笔的输出方向调整回来

            g.rotate(-rot, left, 24);

        }

        //释放画笔资源

        g.dispose();

        //将输出到画布中的字符保存到session中

        HttpSession session = request.getSession();

        session.setAttribute("vCode", strBuilder.toString());

        //设置相应流的响应内容格式

        response.setContentType("image/jpeg");

        //将画布内容往响应流中输出

        //因为jsp页面执行完毕后会释放所有PageContestObject对象,并调用response的getWriter方法,

        //而response对象不能同时使用getWriter方法和getOutputStream()方法,

        //为了下面能够使用response对象的getOutputStream()方法获取输出字节流,往浏览器输出图片,

        //所以需要先对其进行处理

        //out.clear();

        //out = pageContext.pushBody();

        //获取返回给浏览器客户端的响应流

        try (OutputStream output = response.getOutputStream()) {

            //将画布内容往响应流中输出

            ImageIO.write(image, "jpeg", output);

        }

    }

    @Override

    protected void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        processRequest(request, response);

    }

    @Override

    protected void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        processRequest(request, response);

    }

    @Override

    public String getServletInfo() {

        return "Short description";

    }

}

2. 验证码显示和输入界面(JSP文件名:checkCode.jsp)

<%@page contentType="text/html;charset=gbk" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        <title>JSP页面布局的例子程序--Form</title>

//css文件后加?v=1参数可以使客户端浏览器及时下载更新css样式,方便程序调试

        <link rel="stylesheet" type="text/css" href="css/form.css?v=1">

//实现验证码更新的JS程序

        <script type="text/javascript">

            function reload() {

                var vImage = document.getElementById("ckCode");

                var vDate=new Date();

                vImage.src="/Jsj-4/CheckCode?time="+vDate.getTime();

            }

        </script>

        <script type="text/javascript" src="js/form.js"></script>

    </head>

    <body>

        <table  class="formattable" align="center" >

            <form id="form1" name="form1" action="checkCodePro.jsp" method="post"  target="" align="center">

                <tr><th></th><th>学生登录界面</th><th></th></tr>

                <tr>

                    <td class="colleft">学号:</td>

                    <td class="colcenter"><input id="stuno" name="stuno" type="text" size="20"></td>

                    <td class="colright" >*必填项</td>

                </tr>

                <tr>

                    <td class="colleft">姓名:</td>

                    <td class="colcenter"><input id="stuname" name="stuname" type="text" size="20"></td>

                    <td class="colright" >*必填项</td>

                </tr>

                <tr>

                    <td class="colleft">密码:</td>

                    <td class="colcenter"><input id="password" name="password" type="password" size="20"></td>

                    <td class="colright"></td>

                </tr>

                <tr>

                    <td class="colleft">验证码:</td>

                    <td class="colcenter">

                        <input id="checkcode" name="checkcode" type="text" size="20">

                    </td>

                    <td class="colright">

                        <img height="22" id="ckCode" name="ckCode" src="/Jsj-4/CheckCode"  onclick="reload()">

                    </td>

                </tr>

                <tr>

                    <td class="colleft"></td>

                    <td align="center">

                      <input class="labelButton" id="submit" name="submit" type="submit" value="登录">

                        <input class="labelButton" id="reset" name="reset" type="reset" value="重置">

                    </td>

                    <td class="colright"></td>

                </tr>

            </form>

        </table>

    </body>

</html>

3.验证码验证程序(JSP文件名:checkCodePro.jsp)

<%@page contentType="text/html;charset=gbk" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        <title>JSP应用验证码的例子</title>

    </head>

    <body>

        <%

            String stuno = request.getParameter("stuno");

            out.println("学号:"+stuno+"<br>");

            String stuname = request.getParameter("stuname");

            stuname=new String(stuname.getBytes("8859_1"),"gbk");

            out.println("学生姓名:"+stuname+"<br>");

            String password=request.getParameter("password");

            out.println("密码:"+password+"<br>");

            String vCheckCode=request.getParameter("checkcode");

            vCheckCode=vCheckCode.toLowerCase();

            out.println("输入的验证码:"+vCheckCode+"<br>");

            String vCkCode=(String)session.getAttribute("vCode");

            vCkCode=vCkCode.toLowerCase();

            out.println("生成的验证码:"+vCkCode+"<br>");

            if(!vCheckCode.equals(vCkCode)){

                out.println("输入的验证码是错误的!<br>");

                out.println("<a href='/Jsj-4/4-2checkCode.jsp'>第一种返回方式</a><br>");

                out.println("<a href='javascript:history.back(-1)'>第二种返回方式</a>");

            }

//第三种返回方式

            if(!vCheckCode.equals(vCkCode)){

                out.println("<script type='text/javascript'>");

                out.println(" alert('验证码输入错误!');");

                out.println(" window.history.back(-1);");

                out.println("</script>");

            }

        %>

    </body>

</html>

标签:Web,Java,request,验证码,应用,println,import,response,out
From: https://www.cnblogs.com/Freeland98/p/17324765.html

相关文章

  • C#写的Webservice,如何调取Web.config下的配置
    1、调取“AppSettings”里的内容string_hscjHeaderKey=WebConfigurationManager.AppSettings["HttpHeaderKey"];2、调取数据库连接配置需要先引用“usingSystem;”///<summary>///本地数据库连接///</summary>publics......
  • Java语言的基本元素:类和对象
    引入人认识世界,其实就是面向对象的。比如,我们认识一下美人鱼(都没见过)经过“仔细学习”,发现美人鱼通常具备一些特征:女孩有鱼尾美丽这个总结的过程,其实是抽象化的过程。抽象出来的美人鱼的特征,可以归纳为一个美人鱼类。而图片中的都是这个类呈现出来的具体的对象。类和对......
  • Pake 基于rust 开发的快速web 页面打包app 的工具
    Pake利用了tauri可以实现web页面快速打包桌面app说明对于希望快速打开一个桌面应用的场景,Pake还是值得试用的参考资料https://github.com/tw93/Pake......
  • 12.shell 函数应用
    1.什么是函数函数其实就是一堆命令的集合,用来完成一些特定的代码块。作用:便于代码的复用,跟脚本类似2.函数的基本概述#定义函数#第一种函数名(){  命令集合}#第二种function函数名{  命令集合}#示例  2.函数状态返回  3.状态返回案例 ......
  • 原始java写的模拟HTTP请求 HttpsMethod
    原始java写的模拟HTTP请求packagecom.fc.utility;importjava.awt.image.BufferedImage;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.ByteArrayOutputStream;importjava.io.DataInputStream;importjava.io.DataOutputStream;importja......
  • java 八股文
    目录一、Java基础篇1.接口和抽象类的区别2.重载和重写的区别3.==和equals的区别4.异常处理机制5.HashMap原理6.想要线程安全的HashMap怎么办?7.ConcurrentHashMap原如何保证的线程安全?8.HashTable与HashMap的区别9.ArrayList和LinkedList的区别10.如何保证ArrayList的线......
  • Hugging News #0414: Attention 在多模态情景中的应用、Unity API 以及 Gradio 主题构
    每一周,我们的同事都会向社区的成员们发布一些关于HuggingFace相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「HuggingNews」,本期HuggingNews有哪些有趣的消息,快来看看吧!社区动向Attention在视觉领域的应用注......
  • ES的Java API 操作(五)
    我看到希望,哪怕只有微小的一束光,我也会拼尽全力去寻找.上一章简单介绍了ES聚合查询(四),如果没有看过,请观看上一章我们之前都是使用Postman请求来操作索引,操作文档,查询数据的,这一章节,老蝴蝶使用JavaApi进行处理.一.简单的JavaAPIES环境搭建一.一添加pom.xml依赖......
  • 学习JavaScript 一
    文件引用在一个单独的js文件中也可以编写JavaScript代码,然后在HTML文件中使用script标签进行引用,以下是一个简单演示。   遍历对象枚举遍历对象中的属性,可以使用for…in语句循环,对象中有几个属性,循环体就会执行几次。语法格式:for(var变量in对象){}案例演示:......
  • Java继承与多态
    基本概念被继承的类称为基类或父类或超类,而新的类被称为派生类或子类。一般把基类和派生类实例的集合称作类继承层次结构。Java中的类只支持单一继承(即一个类只有一个父类)。在需要多重继承的场合,可以使用接口机制来实现。 子类会自动继承父类中的非private成员(是否继承静态......