ssm 登录验证码使用

今天在写一个页面的时候用到了验证码,就自己搞了一下,随便发出来,方便大家参考使用,不对的请指正!
首先在ssm的common的工具包中增加一个生成验证码的类:

import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;

public class CodeUtil {

    /**
     * 绘画验证码
     *
     * @param output
     * @return
     */
    public String drawImg(ByteArrayOutputStream output) {
        String code = "";
        // 随机产生4个字符
        for (int i = 0; i < 4; i++) {
            code += randomChar();
        }
        int width = 70;
        int height = 27;
        BufferedImage bi = new BufferedImage(width, height,
                BufferedImage.TYPE_3BYTE_BGR);
        Font font = new Font("Times New Roman", Font.PLAIN, 20);
        // 调用Graphics2D绘画验证码
        Graphics2D g = bi.createGraphics();
        g.setFont(font);
        Color color = new Color(66, 2, 82);
        g.setColor(color);
        g.setBackground(new Color(226, 226, 240));
        g.clearRect(0, 0, width, height);
        FontRenderContext context = g.getFontRenderContext();
        Rectangle2D bounds = font.getStringBounds(code, context);
        double x = (width - bounds.getWidth()) / 2;
        double y = (height - bounds.getHeight()) / 2;
        double ascent = bounds.getY();
        double baseY = y - ascent;
        g.drawString(code, (int) x, (int) baseY);
        g.dispose();
        try {
            ImageIO.write(bi, "jpg", output);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return code;
    }

    /**
     * 随机参数一个字符
     *
     * @return
     */
    private char randomChar() {
        Random r = new Random();
        String s = "ABCDEFGHJKLMNPRSTUVWXYZ0123456789";
        return s.charAt(r.nextInt(s.length()));
    }
}

控制器中的验证码的方法:

/**
     * @function 加载登录页面
     * @return
     */
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login(){
        return "login";
    }

    /**
     * 获取验证码
     *
     * @param response
     * @param session
     */
    @RequestMapping("/getVerifyCode")
    public void generate(HttpServletResponse response, HttpSession session) {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        CodeUtil codeUtil = new CodeUtil();
        String verifyCodeValue = codeUtil.drawImg(output);
        System.out.println(verifyCodeValue);
        session.setAttribute("verifyCode", verifyCodeValue);
        try {
            ServletOutputStream out = response.getOutputStream();
            output.writeTo(out);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * @function 登录验证
     * @param teacher
     * @param session
     * @return
     */
    @RequestMapping(value = "/login_sub", method = RequestMethod.POST)
    @ResponseBody
    public Msg login_sub(Teacher teacher, HttpSession session, @RequestParam("code") String code){
        String verifyCode= (String) session.getAttribute("verifyCode");
        if(!code.equalsIgnoreCase(verifyCode)){
            return Msg.fail().add("msg", "验证码错误!");
        }else{
            Teacher teacher1 = teacherService.checkLogin(teacher);
            if(teacher1 != null){
                session.setAttribute("teacher", teacher1);
                return Msg.success().add("msg", "欢迎登录");
            }else{
                return Msg.fail().add("msg", "用户名或者密码错误!");
            }
        }
    }

最后就是前端的html代码了!

<!DOCTYPE html>
<HTML  xmlns="http://www.thymeleaf.org">
    <head>
        <meta charset="utf-8" />
        <title>例子</title>
        <link type="text/css"  data-th-href="@{/static/css/index.css}" rel="stylesheet"  />
    </head>
    <body>
        <div class="login_wall">
            <div class="login_logo">
                <img class="login_img" data-th-src="@{/static/images/logo.png}">
            </div>
            <div class="login_main">
                <span class="login_span fl">
                    <img data-th-src="@{/static/images/login_07.png}" width="422" height="322">
                </span>
                <div class="login_dl fr">
                    <form >
                        <span><img data-th-src="@{/static/images/login_j_03.png}">登录<a class="fr" data-th-href="@{/register}">注册</a></span>
                        <p><em>账 号:</em><input type="text" name="username"></p>
                        <p><em>密 码:</em><input type="text" name="password"></p>
                        <p><em>验证码:</em><input type="text" name="code" style="width:134px;  height:27px;"><img data-th-src="@{/getVerifyCode}" style="margin-left:5px" id="Img" onclick="changeCode();"></p>
                        <input type="button" value="确定" id="login_btn"/>
                    </form>
                </div>
                <div class="clear"></div>
            </div>

        </div>
    </body>
    <script type="text/javascript" data-th-src="@{/static/js/jQuery1.7.2.js}"></script>
    <script type="text/javascript" data-th-inline="javascript">
        /*<![CDATA[*/

        // 获取当前时间
        function genTimestamp() {
            var time = new Date();
            return time.getTime();
        }

        // 点击获取验证码
        function changeCode() {
            $("#Img").attr("src", "/getVerifyCode?t=" + genTimestamp());
        }

        // 点击登录
        $("#login_btn").click(function(){
            var username = $("input[name='username']").val();
            var password = $("input[name='password']").val();
            var code = $("input[name='code']").val();
            if(username != "" && password != ""){
                var data = {"username":username, "password": password};
                // console.log(data); return false;
                $.post("/login_sub?code="+code, data, function(res){
                    // console.log(res); return false;
                    if(res.code == 100){
                        alert(res.extend.msg);
                        location.href = "/index";
                    }
                })
            }else{
                alert("用户名和密码未填写!");
            }
        })
        /*]]>*/
    </script>
</html>

具体过程:
现用工具类创建一个验证码的图片,将其放在response对象流中,在将code值放在session中,在前台显示,点击刷新是的时候增加时间戳,防止缓冲;在进行验证的时候对在session中保存的code与提交的code进行比较验证过在验证用户名密码。

猜你喜欢

转载自blog.csdn.net/yhflyl/article/details/80944684