在一些类似于管理系统的项目中,我们在登录时经常会用到图片验证码。这里把我自己写的一个小系统(后台是java语言)的验证码部分摘出来。

总体思路是后端有一个生成验证码图片的接口,把验证码图片写入浏览器,前端页面在img标签里的src属性里填写后端生成验证码图片的接口地址即可。

1、java部分-CaptchaController.java

我这里是把后端生成的验证码生成图片返回给浏览器时,同时存入到了数据库中,前端登录时,后端根据前端输入的验证码和数据库中的验证码作对比,来判断是否可以登录。

package com.lin.controller;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random; import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import com.lin.domain.Captcha;
import com.lin.service.SysUserService; /**
* 验证码-controller
* @author libo
*/
@Controller
@RequestMapping("/captcha")
public class CaptchaController { @Autowired
private SysUserService uService; /**
* 随机字符字典
*/
private static final char[] CHARS = { '2', '3', '4', '5', '6', '7', '8',
'9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M',
'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm',
'n', 'p', 'q', 'r', 's', 't', 'u' ,'v', 'w', 'x', 'y', 'z'}; /**
* 随机数
*/
private static Random random = new Random(); /**
* 获取4位随机数
* @return
*/
private static String getRandomString() {
StringBuffer buffer = new StringBuffer();
for(int i = 0; i < 4; i++) {
buffer.append(CHARS[random.nextInt(CHARS.length)]);
}
return buffer.toString();
} /**
* 获取随机数颜色
* @return
*/
private static Color getRandomColor() {
return new Color(random.nextInt(255),random.nextInt(255), random.nextInt(255));
} /**
* 返回某颜色的反色
* @param c
* @return
*/
private static Color getReverseColor(Color c) {
return new Color(255 - c.getRed(), 255 - c.getGreen(), 255 - c.getBlue());
} /**
* 生成验证码
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
@ResponseBody
@RequestMapping(value="/getCaptcha.do", method=RequestMethod.GET)
public void outputCaptcha(HttpServletRequest request, HttpServletResponse response, String rad)
throws ServletException, IOException { // 设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg"); String randomString = getRandomString(); //生成的验证码 Captcha c = new Captcha();
c.setCaptchaId(rad);
c.setCaptcha(randomString.toUpperCase());
Integer id = uService.saveCaptcha(c);//保存验证码到数据库中
if(id > 0){ //验证码保存成功 }else{ //验证码保存失败
return;
} int width = 100; //验证码图像的宽度
int height = 34; //验证码图像的高度 // 在内存中创建图象
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
for(int i=0; i<randomString.length(); i++){
Color color = getRandomColor();
Color reverse = getReverseColor(color);
g.setColor(color); //设置字体颜色
g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 25)); //设置字体样式
g.fillRect(0, 0, width, height);
g.setColor(reverse);
g.drawString(randomString, 18, 25);
}
//随机生成一些点
for (int i = 0, n = random.nextInt(100); i < n; i++) {
g.drawRect(random.nextInt(width), random.nextInt(height), 1, 1);
}
// 随机产生干扰线,使图象中的认证码不易被其它程序探测到
for (int i = 0; i < 10; i++) {
g.setColor(getRandomColor());
final int x = random.nextInt(width-1); // 保证画在边框之内
final int y = random.nextInt(height-1);
final int xl = random.nextInt(width);
final int yl = random.nextInt(height);
g.drawLine(x, y, x + xl, y + yl);
}
g.dispose(); //图像生效
ImageIO.write(bi, "JPEG", response.getOutputStream()); //输出图片到页面 } }

2、html部分-login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>后台管理系统登录</title>
<link rel="stylesheet" href="/common/css/index.css">
<script src="/scripts/apiConfig.js"></script>
<script src="/lib/jquery/jquery.min.js"></script>
<script src="/lib/aes/aes.min.js"></script>
<script src="/common/js/utils.js"></script>
</head>
<body>
<div class="layout">
<div class="top-name">后台管理系统
<span>Background Management System</span>
</div>
<div class="main">
<div class="item">
<label style="word-spacing: 10px;">邮 箱:</label>
<input type="text" id="loginEmail" class="f-s-14" autocomplete="off" placeholder="请输入邮箱">
<span class="err-tip" id="tipLEmail" ng-class="m-l-15"></span>
</div>
<div class="item">
<label style="word-spacing: 10px;">密 码:</label>
<input type="password" id="loginPwd" class="f-s-14" autocomplete="off" placeholder="请输入密码">
<span class="err-tip " id="tipLPwd" ng-class="m-l-15"></span>
</div>
<div class="item clearfix">
<label>验证码:</label>
<input type="text" id="captcha" class="f-s-14" placeholder="请输入验证码" style="width: 200px;">
<a href="javascript:void(0);" onclick="updateCaptcha()" style="height: 36px;width: 100px;float: right;">
<img src="" alt="" id="captcha_img">
</a>
<span class="err-tip" id="tipCaptcha" ng-class="m-l-15"></span>
</div>
<div style="text-align: center;margin-top: -10px;height: 20px;margin-bottom: 5px;">
<span class="err-tip" id="error" ng-class="m-l-15" style="font-size: 14px;"></span>
</div>
<div class="item">
<button type="button" class="submit" id="submit" style="outline: none;">登 录</button>
</div>
</div>
</div>
</body>
<script> //更新验证码
var random = '';
function updateCaptcha() {
random = new Date().getTime()+''+Math.floor(Math.random() * Math.pow(10, 8));
$('#captcha_img').attr('src', hostObj.host+'/captcha/getCaptcha.do?rad='+random);
}
$(function () {
//页面加载的时候就获取验证码
updateCaptcha(); $('#loginEmail').blur(function () {
checkLoginEmail();
});
$('#loginPwd').blur(function () {
checkLoginPwd();
});
$('#captcha').blur(function () {
checkCaptcha();
}); $("#submit").click(function() {
var flag1 = checkLoginEmail();
var flag2 = checkLoginPwd();
var flag3 = checkCaptcha();
if(!flag1 || !flag2 || !flag3){
return;
}
$.ajax({
type:'post',
url: hostObj.host+'/sysUser/login.do',
dataType:"json",
data:{
loginEmail:$("#loginEmail").val(),
loginPwd:encrypt($("#loginPwd").val()),
captcha: $('#captcha').val(),
captchaId: random
},
success:function(res) {
if(res.success == 1){
var user = {
id: res.data.id,
email: res.data.email,
createTime: res.data.createTime.substring(0,19),
lastLoginTime: res.data.lastLoginTime.substring(0,19),
status: res.data.status
}
window.location.href = "main.html";
}else{
$('#error').html(res.error.msg);
if(res.error.code == 4000){
$('#captcha').focus();
}
}
},
error:function(res){
$('#error').html('系统错误!');
}
});
}); function checkLoginEmail() {
if($.trim($('#loginEmail').val()) == ''){
$('#tipLEmail').html('请输入邮箱');
return false;
}else{
$('#tipLEmail').html('');
return true;
}
} function checkLoginPwd() {
if($.trim($('#loginPwd').val()) == ''){
$('#tipLPwd').html('请输入登录密码');
return false;
}else{
$('#tipLPwd').html('');
return true;
}
} function checkCaptcha() {
if($.trim($('#captcha').val()) == ''){
$('#tipCaptcha').html('请输入验证码');
return false;
}else{
$('#tipCaptcha').html('');
return true;
}
}</script>
</html>

3、效果

需要购买阿里云产品和服务的,点击此链接领取优惠券红包,优惠购买哦,领取后一个月内有效: https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=fp9ccf07

登录验证码demo-java的更多相关文章

  1. Java中SSM+Shiro系统登录验证码的实现方法

    1.验证码生成类: import java.util.Random; import java.awt.image.BufferedImage; import java.awt.Graphics; im ...

  2. Java实现登录验证码

    登录验证码 Servlet /* 从请求中获取数据,获取验证码的session的值转为String类型,       销毁,防止返回后验证码不刷新,重新验证成功       判断验证码是否相同(忽略大 ...

  3. Selenium2学习-018-WebUI自动化实战实例-016-自动化脚本编写过程中的登录验证码问题

    日常的 Web 网站开发的过程中,为提升登录安全或防止用户通过脚本进行黄牛操作(宇宙最贵铁皮天朝魔都的机动车牌照竞拍中),很多网站在登录的时候,添加了验证码验证,而且验证码的实现越来越复杂,对其进行脚 ...

  4. PHP生成图片验证码demo【OOP面向对象版本】

    下面是我今天下午用PHP写的一个生成图片验证码demo,仅供参考. 这个demo总共分为4个文件,具体代码如下: 1.code.html中的代码: <!doctype html> < ...

  5. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十七):登录验证码实现(Captcha)

    登录验证码 登录验证是一般系统都会有的功能,验证的方式也多种多样,比如输入式验证码,拖动式验证条,拖动式验证拼图等等. 我们这里先实现常规的输入验证码的方式,右边显示验证码图片,点击可刷新,左边输入验 ...

  6. 登录验证码实现(Captcha)

    登录验证码 登录验证是一般系统都会有的功能,验证的方式也多种多样,比如输入式验证码,拖动式验证条,拖动式验证拼图等等. 我们这里先实现常规的输入验证码的方式,右边显示验证码图片,点击可刷新,左边输入验 ...

  7. Vue Springboot (包括后端解决跨域)实现登录验证码功能详细完整版

    利用Hutool 基于Vue.ElementUI.Springboot (跨域)实现登录验证码功能 前言 一.Hutool是什么? 二.下面开始步入正题:使用步骤 1.先引入Hutool依赖 2.控制 ...

  8. 获取登录验证码失败及前后端不同域导致session丢失问题分析记录

    前言 前两周在把兄弟公司的几个服务部署到我们公司测试环境服务器的时候又遇到了不少问题,因为是前后端分离的项目,所以这次也同样遇到了跨域问题,解决方式也跟上一回的不一样,这里就再来分析记录一下. 登录验 ...

  9. selemiun 自动化测试登录验证码处理

    selemiun 自动化测试登录验证码处理 一.软件及插件的安装 1.火狐浏览器版本(55.0(x64 zh-CN):https://www.cnblogs.com/sandysun/p/783811 ...

  10. 通过Cookie跳过登录验证码【限cookie不失效有用】

    验证码,相信每个写web自动化测试的同学来说,都是个头疼的事,怎么办呢? 方法还是有的,先说今天这种方式,通过cookie绕过登录验证码 思路: 需要你通过抓包工具抓到你登录的cookie 接下来开始 ...

随机推荐

  1. Python 简单的天气预报

    轻巧的树莓派一直是大家的热爱,在上面开发一些小东西让我们很有成就感,而在linux下,python能使麻烦的操作变得简单,而树莓派功耗还很低,相结合,完美! 1,直接进入正题,一般在linux或树莓派 ...

  2. Linux的chattr与lsattr命令详解

    Linux的chattr与lsattr命令详解 这两个命令是用来查看和改变文件.目录属性的,与chmod这个命令相比,chmod只是改变文件的读写.执行权限,更底层的属性控制是由chattr来改变的. ...

  3. Linux nc 命令传输文件

    NAME nc - arbitrary TCP and UDP connections and listensSYNOPSIS     nc [-46DdhklnrStUuvz] [-i interv ...

  4. (转)Ubuntu 12.04 中安装和配置 Java JDK

    http://www.cnblogs.com/bluestorm/archive/2012/05/10/2493592.html 先去 Oracle下载Linux下的JDK压缩包,我下载的是jdk-7 ...

  5. RabbitMQ消息队列系列教程(一)认识RabbitMQ

    摘要 RabbitMQ是最为流行的消息中间件,是处理高并发业务的利器.本系列教程,将跟大家一起学习RabbitMQ. 目录 RabbitMQ是什么? RabbitMQ的特点是什么? 一.RabbitM ...

  6. SpringBoot之彩色输出

    spring.output.ansi.enabled NEVER:禁用ANSI-colored输出(默认项) DETECT:会检查终端是否支持ANSI,是的话就采用彩色输出(推荐项) ALWAYS:总 ...

  7. 深入理解Postgres中的cache

    众所周知,缓存是提高数据库性能的一个重要手段.本文着重讲一讲PostgreSQL中的缓存相关的东西.当然万变不离其宗,原理都是共同的,理解了这些,你也很容易把它运用到其它数据库中. What is a ...

  8. Mybatis3 快速入门

    Mybatis3 快速入门 目前常见的持久层java框架有Hibernate,Mybatis,SpringData.笔者比较喜欢用SpringData.Hibernate 和 Mybatis 也经常用 ...

  9. 题目八 one + two = 3 soj

    读入两个小于100的正整数A和B,计算A+B.需要注意的是:A和B的每一位数字由对应的英文单词给出. 测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两 ...

  10. 【转】【JAVA应用】多线程断点下载

    [转自] 光仔December http://blog.csdn.net/acmman 问题:多线程下载的好处? 多线程下载比单线程下载快,主要的原因是采用多线程下载,可以抢占更多的服务器资源.抢占C ...