java验证码--方法二

html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
<!--    <script type="text/javascript" th:src="@{/jquery-1.8.3.min.js}"></script>-->
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.8.0/jquery-1.8.0.min.js"></script>
    <script type="application/javascript">

        //看不清换一张验证码
        function newimage() {
            document.getElementById("codeimg").src="/createImage?date="+new Date();
        }
        //看不清换一张验证码
        function newimage02() {
            document.getElementById("codeimg2").src="/captcha?date="+new Date();
        }

    </script>
</head>
<body>
    <p><img id="codeimg" src="/createImage"/>
        <a href="javascript:newimage();">看不清</a>
        <input type="text" id="text01"/>
        <input type="button" id="btn01" value="btn01"/>
    </p>
    <p><img id="codeimg2" th:src="@{/captcha}"/>
        <a href="javascript:newimage02();">看不清</a>
        <input type="text" id="text02"/>
        <input type="button" id="btn02" value="btn02"/>
    </p>

<script type="application/javascript">

    $("#btn01").click(function(){
        var codeimg = $("#text01").val();
        $.ajax({
            type: "GET",
            url : "checkImgCode1/" + codeimg,
            success: function(data){
                alert(data.msg);
            }
        });
    });
    $("#btn02").click(function(){
        var codeimg2 = $("#text02").val();
        $.ajax({
            type: "GET",
            url : "checkImgCode2/" + codeimg2,
            success: function(data){
                alert(data.msg);
            }
        });
    });
</script>
</body>
</html>

controller

package com.shengun.controller;

import com.shengun.pojo.JsonReturn;
import com.wf.captcha.utils.CaptchaUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

@Controller
public class ImageController {

    public static final int WIDTH = 120;//生成图片的宽度
    public static final int HEIGHT = 23;//生成图片的高度
    public static final int WORDS_NUMBER = 4;//验证码中字符的个数

    @RequestMapping("/capt")
    public String capt(){
        return "capt";
    }


    @RequestMapping("/captcha")
    public void captcha(HttpServletRequest request, HttpServletResponse response) throws Exception {
        CaptchaUtil.out(request, response);
    }

    @RequestMapping("/createImage")
    public void createImage(HttpServletResponse response, HttpSession session) throws Exception{
        //在内存中创建一张图片
        BufferedImage bi = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_3BYTE_BGR);
        //得到图片
        Graphics g = bi.getGraphics();
        //设置图片的背景色
        setBackGround(g);
        //设置图片的边框
        setBorder(g);
        //在图片上画干扰线
        drawRandomLine(g);
        //在图片上放上随机字符
        String randomString = this.drawRandomNum((Graphics2D)g, "nl");
        //将随机数存在session中
        session.setAttribute("checkcode", randomString);
        System.out.println("系统正确的验证码是:"+randomString);
        //设置响应头通知浏览器以图片的形式打开
        response.setContentType("image/jpeg");
        //设置响应头控制浏览器不要缓存
        response.setDateHeader("expries", -1);
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        //将图片传给浏览器
        ImageIO.write(bi, "jpg", response.getOutputStream());
    }

    @RequestMapping("/checkImgCode1/{codeimg}")
    @ResponseBody
    public JsonReturn checkImgCode1(@PathVariable("codeimg") String codeimg, HttpSession session){
        System.out.println(codeimg);
        String checkcode = (String) session.getAttribute("checkcode");
        if(checkcode != null){
            if (checkcode.equalsIgnoreCase(codeimg)) {
                return JsonReturn.buildSuccess("验证码一致,登录成功");
            }
        }
        return JsonReturn.buildSuccess("验证码不一致");
    }

    @RequestMapping("/checkImgCode2/{codeimg2}")
    @ResponseBody
    public JsonReturn checkImgCode2(@PathVariable("codeimg2") String codeimg2,HttpServletRequest request){
        System.out.println(codeimg2);
        if(!CaptchaUtil.ver(codeimg2,request)){
            CaptchaUtil.clear(request);
            return JsonReturn.buildSuccess("验证码不一致");
        }
        return JsonReturn.buildSuccess("验证码一致,登录成功");
    }


    //设置图片背景色
    //@param g
    private void setBackGround(Graphics g) {
        //设置颜色
        g.setColor(Color.WHITE);
        //填充区域
        g.fillRect(0, 0, WIDTH, HEIGHT);
    }

    /*
     * 设置图片的边框
     * @param g
     * */
    private void setBorder(Graphics g) {
        //设置边框颜色
        g.setColor(Color.BLUE);
        //边框区域
        g.drawRect(1, 1, WIDTH - 2, HEIGHT -2);
    }

    /*
     * 在图片上画随机线条
     * @param g
     * */
    private void drawRandomLine(Graphics g) {
        //设置颜色
        g.setColor(Color.GREEN);
        //设置线条个数并画线
        for ( int i = 0 ; i < 3 ; i++ ) {
            int x1 = new Random().nextInt(WIDTH);
            int y1 = new Random().nextInt(HEIGHT);
            int x2 = new Random().nextInt(WIDTH);
            int y2 = new Random().nextInt(HEIGHT);
            g.drawLine(x1, y1, x2, y2);
        }
    }

    /*
     * 在图片上画随机字符
     * @param g
     * @param createTypeFlag
     * @return String
     * */
    private String drawRandomNum(Graphics g,String createTypeFlag) {
        //设置颜色
        g.setColor(Color.RED);
        g.setFont(new Font("宋体",Font.BOLD,20));
        //数字字母的组合
        String baseNumLetter = "0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ";
        String baseNum = "0123456789";
        String baseLetter = "ABCDEFGHJKLMNOPQRSTUVWXYZ";
        if ( createTypeFlag != null  && createTypeFlag.length() > 0 ) {
            if( createTypeFlag.equals("nl") ) {
                //截取数字和字母的组合
                return createRandomChar((Graphics2D) g,baseNumLetter);
            } else if ( createTypeFlag.equals("n") ) {
                //截取数字的组合
                return createRandomChar((Graphics2D) g,baseNum);
            } else if ( createTypeFlag.equals("l") ) {
                //截取字母的组合
                return createRandomChar((Graphics2D) g,baseLetter);
            }
        } else {
            //截取数字和字母的组合
            return createRandomChar((Graphics2D) g,baseNumLetter);
        }
        return "";
    }

    /*
     * 创建随机字符
     * @param g
     * @param baseChar
     * @return String
     * */
    private String createRandomChar(Graphics2D g , String baseChar) {
        StringBuffer b = new StringBuffer();
        int x = 5;
        String ch = "";
        for ( int i = 0 ; i < WORDS_NUMBER ; i++ ) {
            //设置字体的旋转角度
            int degree = new Random().nextInt() % 30;
            ch = baseChar.charAt(new Random().nextInt(baseChar.length())) + "";
            b.append(ch);
            //正向角度
            g.rotate(degree  * Math.PI / 180 , x,20);

            //每次随机一个颜色
            int red = new Random().nextInt(255);
            int green = new Random().nextInt(255);
            int blue = new Random().nextInt(255);
            Color color=new Color(red,red,blue);
            g.setColor(color);

            g.drawString(ch, x, 20);
            //反向角度
            g.rotate(-degree  * Math.PI / 180 , x,20);
            x+=30;
        }
        return b.toString();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值