在一些类似于管理系统的项目中,我们在登录时经常会用到图片验证码。这里把我自己写的一个小系统(后台是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之numpy模块array简短学习

    1.简介 Python的lists是非常的灵活以及易于使用.但是在处理科学计算相关大数量的时候,有点显得捉襟见肘了. Numpy提供一个强大的N维数组对象(ndarray),包含一些列同类型的元素,这 ...

  2. (一)windows7下solr7.1.0默认jetty服务器环境搭建

    windows7下solr7.1.0默认jetty服务器环境搭建 1.下载solr solr7官网地址:http://lucene.apache.org/solr/ jdk8官网地址:http://w ...

  3. tpshop使用自带极光推送

    推送逻辑在common里面的PushLogic.php;在后台网站->商城设置->推送设置,将极光的ID,密码填一下系统会自动加入数据库里面. 在你所需推送的PHP类里面引用这个文件即可. ...

  4. laravel 表单验证 Exists 规则的基本使用方法

    public function rules(){ return [ 'm_pushing_frequency_level_id' => 'integer|required|exists:m_pu ...

  5. SpringQuartz 实现定时任务调度

    最近公司新项目需要用到定时器,于是研究了一下发现: Spring中使用Quartz有两种方式实现: 第一种是任务类继承QuartzJobBean 第二种则是在配置文件里定义任务类和要执行的方法,类和方 ...

  6. c语言的预处理指令分3种   1> 宏定义   2> 条件编译   3> 文件包含

    宏简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 所有的预处 ...

  7. 2719:陶陶摘苹果-poj

    2719:陶陶摘苹果 总时间限制:  1000ms 内存限制:  65536kB 描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米 ...

  8. phython廖雪峰

    这是小白的Python新手教程,具有如下特点: 中文,免费,零起点,完整示例,基于最新的Python 3版本. Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学 ...

  9. Webpack3.0入门指南

    前言 本文是基于我厂基友的Webpack学习系列(一)初学者使用教程 这篇文章做构建.可能基友的文章是基于Mac环境,我是windows环境,在学习时遇到了很多坑,询问基友,他让我搞个基于window ...

  10. gis电子地图开发公司面临的挑战和机遇

    从上个世纪90年代开始电子地图应用就已经收到人们的关注,但是由于时代的局限性和市场经济发展的不成熟.地理信息系统系统的应用并没有得到很好的利用.只有少数的国家机构和军事系统才能够使用这些应用.随着技术 ...