吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2527|回复: 16
收起左侧

[Java 原创] [java]后台生成随机验证码验证登录

  [复制链接]
wushaominkk 发表于 2021-11-12 15:59
本帖最后由 wushaominkk 于 2023-10-10 17:27 编辑

1636703514(1).jpg
web get请求获取图片
[HTML] 纯文本查看 复制代码
<div class="p2">
            <img id="imgId" src="/get/code">
            <a href="#">看不清,换一张</a>
        </div>


后台代码:
[Java] 纯文本查看 复制代码
/*获取动态验证码*/
    @ResponseBody
    @RequestMapping(value = "/get/code", method = {RequestMethod.POST, RequestMethod.GET})
    public void getCode(HttpServletResponse response) {
        creatImg(response);
    }


[Java] 纯文本查看 复制代码
private void creatImg(HttpServletResponse response) {
        int width = 120;
        int height = 30;
        // 在内存中生成图片
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // 先获取画笔对象
        Graphics2D g = (Graphics2D) image.getGraphics();
        // 设置灰色
        g.setColor(Color.GRAY);
        // 画填充的矩形
        g.fillRect(0, 0, width, height);
        // 设置颜色
        g.setColor(Color.BLUE);
        // 画边框
        g.drawRect(0, 0, width - 1, height - 1);
        // 准备数据,随机获取4个字符
        String words = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
        // 设置颜色
        g.setColor(Color.white);
        // 设置字体
        g.setFont(new Font("隶书", Font.BOLD, 20));
        String code = "";
        //构造存储字符的数组
        char[] a = {};
        //构造存储字符串的集合
        List<String> list = new ArrayList<String>();
        Random random = new Random();
        int x = 20;
        int y = 20;
        for (int i = 0; i < 4; i++) {
            // void rotate(double theta, double x, double y)
            // theta 弧度
            // hudu = jiaodu * Math.PI / 180;
            // 获取正负30之间的角度
            int jiaodu = random.nextInt(60) - 30;
            double hudu = jiaodu * Math.PI / 180;
            g.rotate(hudu, x, y);
            // 获取下标
            int index = random.nextInt(words.length());
            // 返回指定下标位置的字符,随机获取下标
            char ch = words.charAt(index);
            //将字符存入字符数组中
            char[] chc = {ch};
            //使用字符数组构造字符串
            String string = new String(chc);
            //将构造好的字符串添加进list集合中
            list.add(string);
            // 写字符串
            g.drawString("" + ch, x, y);
            g.rotate(-hudu, x, y);
            x += 20;
        }
        for (int i = 0; i < list.size(); i++) {
            code += list.get(i);
        }
        //将验证码存入上下文中
        servletContext.setAttribute("code", code);
        // 设置颜色
        g.setColor(Color.GREEN);
        int x1, x2, y1, y2;
        // 画干扰线
        for (int i = 0; i < 4; i++) {
            x1 = random.nextInt(width);
            y1 = random.nextInt(height);
            x2 = random.nextInt(width);
            y2 = random.nextInt(height);
            g.drawLine(x1, y1, x2, y2);
        }
        // 输出到客户端
        try {
            ImageIO.write(image, "jpg", response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


登录验证:

[Java] 纯文本查看 复制代码
@RequestMapping(value = "/user/login", method = {RequestMethod.POST, RequestMethod.GET})
    public void Login(@RequestBody UserBean userBean, HttpSession session, HttpServletResponse response) throws Exception {
        String code = userBean.getCode();
        //从上下文获取存储的验证码
        String code1 = (String) servletContext.getAttribute("code");
        //账号密码为admin.且验证码(忽略大小写)输入正确,则跳转到登陆成功页面
        if ("".equals(code) || code == null || !code.equalsIgnoreCase(code1)) {
            HttpServletResponseUtil.back(response, 202, "验证码错误!", null);
            return;
        }
        QueryWrapper<UserBean> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", userBean.getUsername());
        queryWrapper.eq("password", userBean.getPassword());
        List<UserBean> beans = mapper.selectList(queryWrapper);
        if (beans != null && beans.size() > 0) {
            log.info("登陆成功,用户名:" + userBean.getUsername());
            log.info("登陆成功,密码:" + userBean.getPassword());
            session.setAttribute("loginUser", userBean);
            HttpServletResponseUtil.back(response, 200, "登录成功!", null);
        } else {
            HttpServletResponseUtil.back(response, -1, "账号密码错误", null);
        }

    }


个人博客 同步更新,大家没事来逛逛,增加点人气

免费评分

参与人数 3吾爱币 +8 热心值 +3 收起 理由
ma4907758 + 1 + 1 谢谢@Thanks!
Midea007 + 1 我很赞同!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Goldrepo 发表于 2021-11-12 17:34
LZ代码里面生成的验证码是存放于servletContext,是全局的储存信息的空间,应该要存放于当前会话Session中吧,不然用户A、B同时请求验证码,后生成的验证码会覆盖前生成的验证码,导致先获取到验证码的用户一直没法验证通过的。。

点评

说的有道理,现在这种方案用的少,安全性不高,大部分现在用的都是短信验证了  详情 回复 发表于 2021-11-12 18:02
 楼主| wushaominkk 发表于 2021-11-12 18:02
Goldrepo 发表于 2021-11-12 17:34
LZ代码里面生成的验证码是存放于servletContext,是全局的储存信息的空间,应该要存放于当前会话Session中 ...

说的有道理,现在这种方案用的少,安全性不高,大部分现在用的都是短信验证了
永恒陌 发表于 2021-11-12 16:14
这是前后分离的方案嘛?

点评

自己随便写的,没有严格按照前后分离  详情 回复 发表于 2021-11-12 18:00
你好港屿 发表于 2021-11-12 16:21
学习到了
limao555 发表于 2021-11-12 17:03
学习一下
IsMe9666 发表于 2021-11-12 17:07
大佬,学习到了!代码全吗
ChakingZ 发表于 2021-11-12 17:24
不错吗,可以的
K091418 发表于 2021-11-12 17:25
楼主 个人博客  不能开放游客发言吗,
Anima-No 发表于 2021-11-12 17:44
永恒陌 发表于 2021-11-12 16:14
这是前后分离的方案嘛?

应该是,src那边应该有删减
meiwan123 发表于 2021-11-12 17:52
不错不错
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 01:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表