8、ssm框架--驗證碼

實現效果:(效果圖看最後)
1、輸入驗證碼,點擊驗證碼圖片或者"看不清楚"這四個字,驗證碼會隨機切換。
2、輸入或者不輸入,點擊一下驗證碼框然後鼠標離開,會做出判斷,爲空提示請輸入驗證碼;已經輸入的話判斷是否和session中的相同,相同打鉤,不相同提示錯誤。

在這裏插入圖片描述

一、jsp代碼

<%@ page contentType="text/html;charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>--%>
<c:set var="ctx" value="${pageContext.request.contextPath }"/>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>註冊頁面</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
    <link type="text/css" rel="stylesheet" href="${ctx}/css/dreamland.css">
    <script type="text/javascript" src="${ctx}/js/jquery.min.js"></script>
    <script type="text/javascript" src="${ctx}/images/lib/js/jquery.min.js"></script>
</head>

<body class="login_bj" style="background-color: grey">

<div class="zhuce_body" >
    <div class="zhuce_kong" id="dre_div">
        <div class="zc">
            <div class="bj_bai" id="regist-left" style="height: 468px">
                <h3>歡迎註冊</h3>
                <form action="${ctx}/doRegister" method="post" id="registerForm">

                    <input id="code" name="code" type="text" class="kuang_txt yanzm"
                           placeholder="驗證碼" onblur="checkCode()">
                    <div>
                        <IMG id="captchaImg" style="CURSOR: pointer"
                             onclick="changeCaptcha()"
                             title="看不清楚?請點擊刷新驗證碼!" align='absmiddle' src="${ctx}/captchaServlet"
                             height="18" width="55">
                        <a href="javascript:;"
                           onClick="changeCaptcha()" style="color: #666;">看不清楚</a> <span id="code_span" style="color: red"></span>
                    </div>
                    <div>

                        <input name="註冊" type="button" class="btn_zhuce" id ="to_register" value="註冊">
                        <br/>
                        <span style="color: red">${error}</span>
                    </div>

                </form>
            </div>

        </div>
    </div>
</div>
<div style="text-align:center;">
</div>
</body>

<script type="text/javascript">
    //更換驗證碼
    function changeCaptcha() {
        $("#captchaImg").attr('src', '${ctx}/captchaServlet?t=' + (new Date().getTime()));
    }

    //驗證碼校驗
    var flag_c = false;
    function checkCode() {
        var code = $("#code").val();
        code = code.replace(/^\s+|\s+$/g,"");
        if(code == ""){
            $("#code_span").text("請輸入驗證碼!").css("color","red");
            flag_c = false;
        }else{
            $.ajax({
                type: 'post',
                url: '/user/checkCode',
                data: {"code": code},
                dataType: 'json',
                success: function (data) {
                    var val = data['message'];
                    if (val == "success") {
                        $("#code_span").text("√").css("color","green");
                        $("#reg_span").text("");
                        flag_c = true;
                    }else {
                        $("#code_span").text("驗證碼錯誤!").css("color","red");
                        flag_c = false;
                    }
                }
            });

        }
        return flag_c;
    }


</script>
</html>


二、驗證碼Servelet類

/*
 * Copyright (C) 2011-2013 dshine.com
 * All rights reserved.
 * ShangHai Dshine - http://www.dshine.com
 */
package com.ssm.common;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

/**
 * Created by wly on 2018/4/17.
 */
@WebServlet(name = "BaseServlet",urlPatterns = "/captchaServlet")
public class CodeCaptchaServlet extends HttpServlet {

    public static final String VERCODE_KEY = "VERCODE_KEY";
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
       // request.getSession().removeAttribute(LOGIN_VERCODE_KEY);
        request.getSession().removeAttribute(VERCODE_KEY);
        // 首先設置頁面不緩存
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        
      //在內存中創建圖象
        int iWidth = 55, iHeight = 18;
        BufferedImage image = new BufferedImage(iWidth, iHeight,
                BufferedImage.TYPE_INT_RGB);
        //獲取圖形上下文
        Graphics g = image.getGraphics();
        //設定背景色
        g.setColor(Color.white);
        g.fillRect(0, 0, iWidth, iHeight);
        //畫邊框
        g.setColor(Color.black);
        g.drawRect(0, 0, iWidth - 1, iHeight - 1);
        //取隨機產生的認證碼(4位數字)
        //String rand = Utils.getCharacterAndNumber(4);
        int intCount=0; 
        intCount=(new Random()).nextInt(9999);// 

        if(intCount <1000)intCount+=1000; 
        String rand=intCount+"";
        //將認證碼顯示到圖象中
        g.setColor(Color.black);
        g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
        g.drawString(rand, 5, 15);
        //隨機產生88個干擾點,使圖象中的認證碼不易被其它程序探測到
        Random random = new Random();
        for (int iIndex = 0; iIndex < 100; iIndex++) {
            int x = random.nextInt(iWidth);
            int y = random.nextInt(iHeight);
            g.drawLine(x, y, x, y);
        }
        
        // 將生成的隨機字符串寫入session
       // request.getSession().setAttribute(LOGIN_VERCODE_KEY, rand);
        request.getSession().setAttribute(VERCODE_KEY, rand);
        //圖象生效
        g.dispose();
        //輸出圖象到頁面
        ImageIO.write(image, "JPEG", response.getOutputStream());
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    public void init()
            throws ServletException {
        super.init();
    }

    private static final long serialVersionUID = 5413310437308046316L;
    
}

三、Controller類

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private HttpServletRequest request; //自動注入request

 
@RequestMapping("/checkCode")
    @ResponseBody
    public Map<String, Object> checkCode(Model model, @RequestParam(value = "code", required = false) String code) {
        Map map = new HashMap<String, Object>();
        String vcode= (String) request.getSession().getAttribute(CodeCaptchaServlet.VERCODE_KEY);
        if (code.equals(vcode)) {
            //驗證碼正確
            map.put("message", "success");
        } else {
            //驗證碼錯誤
            map.put("message", "fail");
        }
        return map;
    }

四、最終實現效果

1、啥都不輸入:
在這裏插入圖片描述

2、輸入正確
在這裏插入圖片描述

3、輸入錯誤

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章