如何实现登陆界面验证码的刷新功能?

  • 在通过Maven配置好web服务后,在webapp文件夹中我们建立一个login.jsp文件

  • <head>标签用于定义文档的头部,它是所有头部元素的容器。<head> 中的元素可以引用脚本、指示浏览器在哪里找到样式表、提供元信息等等。

  • <body>元素定义文档的主体,包含文档的所有内容(比如文本、超链接、图像、表格和列表等等。)

  • 建立完以后我们将之前写的代码(一)中的LoginController类复制过来,修改一下

  • 需要注意的是我们可以在<body></body>中间插入脚本片段,这边有两种格式

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>简单登陆页面</title>
    </head>
    <body>
    <%
    //内置对象request,response,pageContext,session,application,config,out,page,用于异常的,共九个
    String loginName = request.getParameter("loginName");
    String loginPwd = request.getParameter("loginPwd");
    String validCode = request.getParameter("validCode");

    String saveCode = (String) request.getSession().getAttribute("code");//用强转不用tostring,否则会空指针异常
    //response.getWriter().println("欢迎登陆");

    String msg = null;
    if (StrUtil.isBank(loginName) && StrUtil.isBank(loginPwd)) {
        msg = "<font size = '20'>请输入账号密码!</font>";
    } else {
        if (StrUtil.isBank(validCode)) {
            msg = "<font size = '20'>请输入验证码!</font>";
        } else {
            if (validCode.equalsIgnoreCase(saveCode)) {//比较验证码,不区分大小写
                //登陆名称是你的学号,密码是1234,那么显示下面的内容,否则,显示用户账户或密码错误
                if ("5197101250".equals(loginName) && "1234".equals(loginPwd)) {
                    msg = "<font size = '20'>欢迎" + loginName + "登陆</font>";
                    
                } else {
                    msg = "<font size = '20'>账号或密码错误!</font>";
                }
            } else {
                msg = "<font size = '20'>验证码错误!</font>";
            }
        }
    }
%>
        <form action="" name="login" method="post">
            登陆名称:<input type="text" name="loginName"><br>
            登陆密码:<input type="password" name="loginPwd"><br>
            验证码值:<input type="text" name="validCode" size="4">
            <img src="CaptcheController.jsp" ><br>
            <input type="submit" value="登陆">
            <input type="reset" value="取消"><br>
        </form>
    </body>
</html>
  • 我们将CaptcheController类代码复制到里面
<%@ page import="java.util.Random" %>
<%@ page import="java.awt.*" %>
<%@ page import="java.awt.image.BufferedImage" %>
<%@ page import="javax.imageio.ImageIO" %><%--
  Created by IntelliJ IDEA.
  User: qsX
  Date: 2020/4/13
  Time: 17:33
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="image/jpeg;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>验证码图片</title>
    </head>

    <body>
        <%!
            /**
             * @Description 生成随机干扰
             * @Param [count, g]
             * @Return void
             */
            //随机干扰点
            public void randomDrop(int count, Graphics2D g) {
                for (int i = 0; i < count; i++) {
                    Random rd = new Random();
                    int x = rd.nextInt(130);//产生小于WIDTH的随机整数
                    int y = rd.nextInt(60);//产生小于HEIGHT的随机整数

                    g.setColor(getColor(0));//随机颜色
                    g.drawLine(x, y, x, y + 2);//绘制超短的线,看着是个点
                }
            }

            //随机干扰线
            public void randomLine(int count, Graphics2D g) {
                for (int i = 0; i < count; i++) {
                    Random rd = new Random();
                    int xBegin = rd.nextInt(130);//产生小于WIDTH的随机整数,起始位置
                    int yBegin = rd.nextInt(60);//产生小于HEIGHT的随机整数
                    int xEnd = rd.nextInt(xBegin + 50);//终点
                    int yEnd = rd.nextInt(yBegin + 30);
                    g.setColor(getColor(0));//随机颜色
                    g.drawLine(xBegin, yBegin, xEnd, yEnd);//绘制线条
                }
            }

            /**
             * @Description 生成随机验证码
             * @Param 需要几位验证码
             * @Return 随机生成的验证码
             */
            //随机验证码
            public String randomString(int count) {
                StringBuilder builder = new StringBuilder();
                String source = "ABCDEFGHJKLMNPQRSTUVWXYZ0123456789";
                Random rnd = new Random();
                for (int i = 0; i < count; i++) {
                    int pos = rnd.nextInt(source.length());
                    String s = source.substring(pos, pos + 1);
                    builder.append(s);//每位验证码之间加个空格

                }
                return builder.toString();
            }

            /**
             * @Description 生成随机颜色值
             * @Param a越大颜色越深
             * @Return 随机的RGB颜色
             */
            public Color getColor(int a) {
                Random rd = new Random();      //Math.random()为生成0-1随机数
                int r = rd.nextInt(256 - a);//rd.nextInt(256)为随机生成0-255随机数
                int g = rd.nextInt(256 - a);
                int b = rd.nextInt(256 - a);
                return new Color(r, g, b);
            }
        %>
        <%
            final int WIDTH = 130;
            final int HEIGHT = 60;
            //禁止缓存,防止验证码过期
            response.setHeader("pragma", "no-cache");
            response.setHeader("cache-control", "no-cache");
            response.setHeader("Expires", "0");//过期时间设置为0,就是立马过期的意思

            //申请内存空间
            BufferedImage img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
            //画笔
            Graphics gg = img.getGraphics();
            Graphics2D g = (Graphics2D) gg;//为了旋转功能

            //设置背景颜色
            g.setColor(Color.white);
            //g.fillRect(0,0,100,60);
            //设置背景大小
            g.fillRect(0, 0, WIDTH, HEIGHT);

            //设置背景大小
            g.fillRect(0, 0, WIDTH, HEIGHT);

            //设置干扰线
            randomLine(80, g);

            //设置干扰点
            randomDrop(100, g);

            //设置验证码
            Random rd = new Random();
            //储存验证码值
            StringBuilder b = new StringBuilder();

            //循环四次,四位
            for (int i = 0; i < 4; i++) {
                //字体固定,大小随机
                g.setFont(new Font("name", Font.BOLD, rd.nextInt(20) + 25));
                //设置验证码颜色,稍微深一点
                g.setColor(getColor(50));
                //调用randomString方法设置验证码个数
                String code = randomString(1);
                //设置每个验证码的坐标
                int x = 30 * i;
                int y = rd.nextInt(10) + 35;
                //设置随机旋转角度
                int revolve = rd.nextInt(10);
                //设置随机顺时针或逆时针旋转
                if (rd.nextBoolean()) revolve = -revolve;
                //旋转,Math.toRadians角度转弧度
                g.rotate(Math.toRadians(revolve), 5 + x, HEIGHT / 3);
                //g.rotate(Math.toRadians(-revolve),65 , 30);
                //设置验证码位置,x大往右,y大往下
                g.drawString(code, 5 + x, y);
                //将每一位验证码存入b
                b.append(code);
            }

            //创建session对象,将验证码code  保存在session中
            //session = request.getSession();
            session.setAttribute("code", b.toString());
            // 释放资源
            g.dispose();

            // 图片输出 ImageIO
            ServletOutputStream outputStream = response.getOutputStream();
            ImageIO.write(img, "JPEG", response.getOutputStream());
            try {
                outputStream.flush();
            } catch (Exception ex) {
            } finally {
                outputStream.close();
            }
        %>
    </body>
</html>

  • 再次运行看一下效果
  • 接下来我们来看下如何实现点击验证码让其刷新的效果,试一下超链接把
  • 但是我们这里需要注意,这边的超链接就不能使用src地址了,如果是这样就变成整个页面跳到验证码的页面了
  • 所以我们这边加一个javascript:reloadCheckImg(),执行一段javascript语句,从而防止链接跳转。
  • 还需要给他加一个id,会有大用处,下面会提到
 <a href="javascript:reloadCheckImg();"><img src="CaptcheController.jsp" id="codeImg"></a><br>
  • 然后我们需要在<head>中载入jquery,
  • 附带jquery-3.3.1.js下载地址:http://www.jq22/jquery-info122
  • 下载完后复制到webapp中
  • 接下来我们建立一个reloadCheckImg()功能,并调用attr() 方法来设置或返回被选元素的属性和值。
  • 完成后的代码为:
<%--
  Created by IntelliJ IDEA.
  User: qsX
  Date: 2020/4/14
  Time: 21:10
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>简单登陆页面</title>
        <script type="text/javascript" src="jquery-3.3.1.js"></script>
        <script type="text/javascript">
            function reloadCheckImg() {

                $("#codeImg").attr("src", "CaptcheController.jsp?t=" + new Date().getTime())
            }
        </script>
    </head>
    <body>
        <form action="" name="login" method="post">
            登陆名称:<input type="text" name="loginName"><br>
            登陆密码:<input type="password" name="loginPwd"><br>
            验证码值:<input type="text" name="validCode" size="4">
            <a href="javascript:reloadCheckImg();"><img src="CaptcheController.jsp" id="codeImg"></a><br>
            <input type="submit" value="登陆">
            <input type="reset" value="取消"><br>
        </form>
    </body>
</html>

  • 这边(1) 中就是要修改图片的id。如果不加id写img的话就是所有的图片都被修改了,还有就是id前要加#,要加#,要加#,重要的事说三遍。
  • (2)中即为修改后的值。由于每次的点击时间不同,即每次发出的请求参数不同,所以会区别为不同的请求。不加的话点击没有效果
  • 现在点击图片刷新的效果就完成了

更多推荐

jsp简单登陆界面加图形验证码,新手必备(二)验证码刷新