步骤:1、封装VerificationCode类;2、实例化;3、调用getText()方法获取验证码并保存到session;4、调用getImage()方法获得Image对象并输出到浏览器。

Verification类

package com.qfedu.demo.utils;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;public class VerificationCode {private int width = 100;// 生成验证码图片的宽度private int height = 30;// 生成验证码图片的高度//生成的验证码的字体,每次生成的时候从四个字体中随机选择一个private String[] fontNames = { "宋体", "楷体", "隶书", "微软雅黑" };private Color bgColor = new Color(255, 255, 255);// 定义验证码图片的背景颜色为白色private Random random = new Random();//验证码的原文字private String codes = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";private String text;// 记录随机字符串/*** 获取一个随意颜色** @return*/private Color randomColor() {int red = random.nextInt(150);int green = random.nextInt(150);int blue = random.nextInt(150);return new Color(red, green, blue);}/*** 获取一个随机字体** @return*/private Font randomFont() {//获取一个随机的字体String name = fontNames[random.nextInt(fontNames.length)];int style = random.nextInt(4);int size = random.nextInt(5) + 24;return new Font(name, style, size);}/*** 获取一个随机字符** @return*/private char randomChar() {return codes.charAt(random.nextInt(codes.length()));}/*** 创建一个空白的BufferedImage对象** @return*/private BufferedImage createImage() {//创建图片对象BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//获取一个画笔Graphics2D g2 = (Graphics2D) image.getGraphics();//设置画笔的颜色g2.setColor(bgColor);// 设置验证码图片的背景颜色//填充图片的背景g2.fillRect(0, 0, width, height);return image;}/*** 绘制图片的方法* @return*/public BufferedImage getImage() {//创建一个图片对象BufferedImage image = createImage();//继续获取画笔Graphics2D g2 = (Graphics2D) image.getGraphics();//保存随机生成的字符串StringBuffer sb = new StringBuffer();for (int i = 0; i < 4; i++) {String s = randomChar() + "";sb.append(s);g2.setColor(randomColor());g2.setFont(randomFont());float x = i * width * 1.0f / 4;g2.drawString(s, x, height - 8);}this.text = sb.toString();drawLine(image);return image;}/*** 绘制干扰线** @param image*/private void drawLine(BufferedImage image) {Graphics2D g2 = (Graphics2D) image.getGraphics();int num = 5;for (int i = 0; i < num; i++) {int x1 = random.nextInt(width);int y1 = random.nextInt(height);int x2 = random.nextInt(width);int y2 = random.nextInt(height);g2.setColor(randomColor());g2.setStroke(new BasicStroke(1.5f));g2.drawLine(x1, y1, x2, y2);}}public String getText() {return text;}public static void output(BufferedImage image, OutputStream out) throws IOException {ImageIO.write(image, "JPEG", out);}
}

servlet登录接口

package com.qfedu.demo.servlet;import com.fasterxml.jackson.databind.ObjectMapper;
import com.qfedu.demo.model.RespBean;
import com.qfedu.demo.service.UserService;
import com.qfedu.demo.utils.CommonsUtils;
import com.qfedu.demo.utils.VerificationCode;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 javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet(name = "LoginServlet",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {UserService userService=new UserService();protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String action = request.getParameter("action");if ("vcode".equals(action)){//获取验证码VerificationCode verificationCode=new VerificationCode();BufferedImage image = verificationCode.getImage();String text = verificationCode.getText();System.out.println("vcode = " + text);//保存到session,方便以后使用HttpSession session = request.getSession();session.setAttribute("vcode",text);//输出到浏览器VerificationCode.output(image,response.getOutputStream());}else {request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);}}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");Integer result = userService.login(username, password,request);RespBean respBean = null;if (result == CommonsUtils.VCODE_ERROR){respBean = RespBean.error("验证码错误,登录失败");} else if (result == CommonsUtils.ACCOUNT_DISABLED) {respBean=RespBean.error("账户被禁用,登录失败");}else if (result == CommonsUtils.USERNAME_NOT_OR_PASSWORD_ERROR) {respBean = RespBean.error("用户名或者密码输入错误,登录失败");} else if (result == CommonsUtils.LOGIN_SUCCESS) {respBean = RespBean.ok("登录成功");} else {respBean = RespBean.error("登录失败");}response.setContentType("application/json;charset=utf-8");PrintWriter out = response.getWriter();ObjectMapper om = new ObjectMapper();out.write(om.writeValueAsString(respBean));}
}

Java--验证码登录相关推荐

  1. springBoot redis开发的Java快递代拿系统(含人脸识别,验证码登录)

     源码获取:我的博客资源页面可以下载!!!! 项目名称 springBoot redis开发的Java快递代拿系统(含人脸识别,验证码登录) 系统介绍 快递代拿系统 > 该项目使用当前最为流行的 ...

  2. Java实现手机验证码登录和SpringSecurity权限控制

    手机验证码登录和SpringSecurity权限控制 手机快速登录功能,就是通过短信验证码的方式进行登录.这种方式相对于用户名密码登录方式,用户不需要记忆自己的密码,只需要通过输入手机号并获取验证码就 ...

  3. java antd实现登录,基于 antd pro 的短信验证码登录

    概要 整体流程 前端 页面代码 请求验证码和登录的 service (src/services/login.js) 处理登录的 model (src/models/login.js) 后端 短信验证码 ...

  4. java短信验证码登录功能设计与实现

    前言 现在不管是各类的网站,还是大小社交app,登录方式是越来越多了,其中基于短信验证码的登录可以说是各类app必不可少的方式,短信验证码登录以其高效,安全,便捷等特性受到许多用户的青睐 业务案例 如 ...

  5. 你的 Java 验证码和登录程序中可能也存在这样的漏洞

    进行这个整理,是因为在XXX项目的时候,发现登录模块的忘记密码功能,在验证用户身份的时候是通过手机验证码验证的.通过修改响应包的返回参数值,可以绕过验证,进入第三步的密码重置.还有最近测试的一个sso ...

  6. Java验证码及登录中的漏洞分析

    阅读文本大概需要3分钟. 作者:小白007 来源:https://www.cnblogs.com/ping007 进行这个整理,是因为在XXX项目的时候,发现登录模块的忘记密码功能,在验证用户身份的时 ...

  7. Java登录专题-----手机验证码登录 发送验证码

    1.打印日志 ,检验入参 入参为  mobile 手机号 action动作  分为注册,与登录 2. UserInfoModel userInfoModel = new UserInfoModel() ...

  8. 各种登录源码来了!基础登录、验证码登录、小程序登录...全都要!

    现在开发个应用登录比以前麻烦的多.产品经理说用户名密码登录.短信登录都得弄上,如果搞个小程序连小程序登录也得安排上,差不多就是我全都要. 多种登录途径达到一个效果确实不太容易,今天胖哥在Spring ...

  9. Spring Security 实战干货:从零手写一个验证码登录

    1. 前言 前面关于Spring Security胖哥又写了两篇文章,分别图文并茂地介绍了UsernamePasswordAuthenticationFilter和 AuthenticationMan ...

  10. Spring Security构建Rest服务-0702-短信验证码登录

    先来看下 Spring Security密码登录大概流程,模拟这个流程,开发短信登录流程 1,密码登录请求发送给过滤器 UsernamePasswordAuthenticationFilter 2,过 ...

最新文章

  1. 刘光瑞php,PHP Markdown 解析器 HyperDown
  2. 039_Dialog对话框
  3. ML:分类预测问题中评价指标(ER/混淆矩阵P-R-F1/ROC-AUC/RP/mAP)简介、使用方法、代码实现、案例应用之详细攻略
  4. android 8.0手机无法更新版本,安卓手机升级安卓8.0后 系统以后可能都无法回退
  5. c++中的explicit关键字
  6. 七十五、栈+双指针,头条当年接雨水问题
  7. c++编写托管dll_教程:如何编写简单的网站并免费托管
  8. mysql输出重定向_将MySQL输出内容写入(重定向到)文件
  9. IOS开发-UIView之动画效果的实现方法(合集)
  10. Js屏蔽键盘输入的某些字符,用以部分代替正则表达式
  11. windows xp下Apache2.2.11整合Tomcat6.0.20(集群模式无集群模式)
  12. Android应用程序组件Content Provider的启动过程源代码分析(5)
  13. 基于MATLAB的身份证号码识别系统
  14. omap gpio irq
  15. 系统分析与设计——系统顺序图
  16. ntp linux 是什么意思,【NTP】Linux NTP
  17. 数学分析:集合的基本运算
  18. [项目管理] 项目管理之需求管理
  19. Yoga14s 2021锐龙集显版蓝牙失效问题的解决方法
  20. MOS管开关时的米勒效应

热门文章

  1. license程序设计 系统划分 及加密设计 加密算法调用openssl库
  2. 面试官经常问的性能测试面试题有哪些?该怎么回答?
  3. 数仓 即席查询 之 Persto
  4. 网站ftp服务器密码修改,ftp服务器忘记密码修改
  5. 浪潮服务器bios怎么找回密码,服务器BIOS密码丢失解决方法
  6. linux进程的高级管理,Linux进程查看,管理工具
  7. SSH不能传输文件问题
  8. 从后端到前端,JavaScript和Java有关系吗
  9. Python发送163邮箱跳坑指南
  10. app测试之--安卓手机安装测试包