您的位置:首页 > 编程语言 > Java开发

JavaWeb登录页面生成数字或字母图片验证码

2016-08-30 14:01 417 查看
现在大部分的登录或验证系统都拥有了字母或数字图片的验证码,自己也一时兴起,根据网上的demo自己也尝试了一下,很有意思!

下面则是这次实验的效果图:



1.登陆页jsp:

<html>

<head>

    <base href="/">

    <meta charset="UTF-8">

    <title>登陆页面</title>

    <meta name="viewport"

          content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>

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

    <link rel="stylesheet" href="css/login.css">

    <script language="javascript" src="js/jquery-1.9.0.min.js"></script>

    <script language="javascript" src="js/login/login.js"></script>

</head>

<body>

<div class="login_form">

                    <form name='myForm' action='' method='post' >

                            <input type="text" name="userName" id="userName" placeholder="请输入用户名">

                            <input type="password" name="password" id="password" placeholder="请输入密码">

                    </form>

                    <input class="check_input" type="text"  placeholder="请输入验证码">

                    <img id="imgVerify" src="" alt="点击更换验证码" width="112" height="36" onclick="getVerify(this);">//首次获取验证码图片,也可在此将src设为访问路径/getVerify

                    <div class="login_form_warn_lable"></div>

                    <div class="login_form_warn">

                            <span class="warn_text">用户名或密码错误</span>

                    </div>

                    <div class="login_form_submit">

                            <button class="btn_submit" onclick="login();">登   录</button>

                    </div>

                </div>

</body>

</html>

2.登陆页面js:

$(document.body).ready(function () {

    //首次获取验证码

    $("#imgVerify").attr("src","/getVerify?"+Math.random());

});

//点击登录按钮

function login(){

     //校验验证码

    checkSum();

}

//提交表单

function submitForm(){

    document.myForm.action = "/login";

    document.myForm.submit();

}

//获取验证码

function getVerify(obj){

    obj.src = "/getVerify?"+Math.random();

}

//校验验证码

function checkSum(){

    var inputStr = $(".check_input").val();

    if(inputStr!=null && inputStr!=""){

        inputStr = inputStr.toUpperCase();//将输入的字母全部转换成大写

        $.ajax({

            url : "checkVerify",

            data: {inputStr:inputStr},

            success : function(datas) {

                if(datas == "T"){

                    submitForm();//提交表单

                }else{

                    $(".check_input").val("");

                    $(".warn_text").text("验证码输入错误!");

                    $(".login_form_warn").css("display","block");

                }

            }

        });

    }else{

        $(".warn_text").text("请输入验证码");

        $(".login_form_warn").css("display","block");

    }

}

3.(springMVC框架)java后台controller获取和校验验证码:

/**

     * 登录页面生成验证码

     */

    @RequestMapping(value = "getVerify")

    public void getVerify(HttpServletRequest request, HttpServletResponse response){

        response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片  

        response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容  

        response.setHeader("Cache-Control", "no-cache");

        response.setDateHeader("Expire", 0);

        RandomValidateCode randomValidateCode = new RandomValidateCode();

        try {

            randomValidateCode.getRandcode(request, response);//输出验证码图片方法  

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    /**

     * 登录页面校验验证码

     */

    @RequestMapping(value = "checkVerify")

    @ResponseBody

    public String checkVerify(String inputStr, HttpSession session){

        //从session中获取随机数

        String random = (String) session.getAttribute("RANDOMVALIDATECODEKEY");

        if(random.equals(inputStr)){

            return "TURE";//验证码正确

        }else{

            return "FALSE";//验证码错误

        }

    }

4.验证码图片生成工具类:

/**

 * 验证码生成类

 * <p>

 * @author admin

 *

 */

public class RandomValidateCode {

    

    public static final String RANDOMCODEKEY= "RANDOMVALIDATECODEKEY";//放到session中的key     

    //private String randString = "0123456789";//随机产生只有数字的字符串 private String

    private String randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生只有字母的字符串

    //private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串  

    private int width = 95;// 图片宽  

    private int height = 25;// 图片高  

    private int lineSize = 40;// 干扰线数量  

    private int stringNum = 4;// 随机产生字符数量  

    

    private Random random = new Random();

 

    /*

     * 获得字体

     */

    private Font getFont() {

        return new Font("Fixedsys", Font.CENTER_BASELINE, 18);

    }

 

    /*

     * 获得颜色

     */

    private Color getRandColor(int fc, int bc) {

        if (fc > 255)

            fc = 255;

        if (bc > 255)

            bc = 255;

        int r = fc + random.nextInt(bc - fc - 16);

        int g = fc + random.nextInt(bc - fc - 14);

        int b = fc + random.nextInt(bc - fc - 18);

        return new Color(r, g, b);

    }

 

    /**

     * 生成随机图片

     */

    public void getRandcode(HttpServletRequest request,

            HttpServletResponse response) {

        HttpSession session = request.getSession();

        // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类  

        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);

        Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作  

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

        g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));

        g.setColor(getRandColor(110, 133));

        // 绘制干扰线  

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

            drowLine(g);

        }

        // 绘制随机字符  

        String randomString = "";

        for (int i = 1; i <= stringNum; i++) {

            randomString = drowString(g, randomString, i);

        }

        //将生成的随机字符串保存到session中,而jsp界面通过session.getAttribute("RANDOMCODEKEY"),  

        //获得生成的验证码,然后跟用户输入的进行比较  

        session.removeAttribute(RANDOMCODEKEY);

        session.setAttribute(RANDOMCODEKEY, randomString);

        g.dispose();

        try {

            // 将内存中的图片通过流动形式输出到客户端  

            ImageIO.write(image, "JPEG", response.getOutputStream());

        } catch (Exception e) {

            e.printStackTrace();

        }

 

    }

 

    /*

     * 绘制字符串

     */

    private String drowString(Graphics g, String randomString, int i) {

        g.setFont(getFont());

        g.setColor(new Color(random.nextInt(101), random.nextInt(111), random

                .nextInt(121)));

        String rand = String.valueOf(getRandomString(random.nextInt(randString

                .length())));

        randomString += rand;

        g.translate(random.nextInt(3), random.nextInt(3));

        g.drawString(rand, 13 * i, 16);

        return randomString;

    }

 

    /*

     * 绘制干扰线

     */

    private void drowLine(Graphics g) {

        int x = random.nextInt(width);

        int y = random.nextInt(height);

        int xl = random.nextInt(13);

        int yl = random.nextInt(15);

        g.drawLine(x, y, x + xl, y + yl);

    }

 

    /*

     * 获取随机的字符

     */

    public String getRandomString(int num) {

        return String.valueOf(randString.charAt(num));

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: