javaweb登录验证码的实现
第一种
第一步: JSP
<li><input name="validCode" id="validCode" type="text" class="loginvalid" value="" onclick="JavaScript:this.value=''"/><img src="${path}/patchca.htm" id = "patchca" style="display:inline-block; float:right;width:100px; height:48px;line-height:48px;margin-right:100px;padding:0;"></li>
第二步: 后台
@RequestMapping("/patchca.htm")
public void patchca(HttpServletResponse response,HttpSession session) throws IOException
{
CaptchaService cs = new CaptchaService();
response.setContentType("image/png");
response.setHeader("cache", "no-cache");
OutputStream os = response.getOutputStream();
String patchca = EncoderHelper.getChallangeAndWriteImage(cs, "png", os);
session.setAttribute("PATCHCA", patchca);
os.flush();
os.close();
cs = null;
}
第二种
Controller:生成验证码
- @RequestMapping("/user/check.jpg")
- public void createCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
- // 通知浏览器不要缓存
- response.setHeader("Expires", "-1");
- response.setHeader("Cache-Control", "no-cache");
- response.setHeader("Pragma", "-1");
- CaptchaUtil util = CaptchaUtil.Instance();
- // 将验证码输入到session中,用来验证
- String code = util.getString();
- request.getSession().setAttribute(“code”, code);
- // 输出打web页面
- ImageIO.write(util.getImage(), "jpg", response.getOutputStream());
- }
jsp:显示验证码
- <img id="img" src="<%=basePath%>user/check.jpg" onclick="refresh()">
- function refresh() {
- var url = $("#basePath").val() + "user/check.jpg?number="+Math.random();
- $("#img").attr("src",url);
- }
验证:
获取session中的code与前台传回的code是否一致
- /**
- * 验证码验证
- *
- * @param session
- * @param code
- */
- private void checkCode(HttpSession session, String code) {
- String codeSession = (String) session.getAttribute(“code”);
- if (StringUtils.isEmpty(codeSession)) {
- log.error("没有生成验证码信息");
- throw new IllegalStateException("ERR-01000");
- }
- if (StringUtils.isEmpty(code)) {
- log.error("未填写验证码信息");
- throw new BussinessException("ERR-06018");
- }
- if (codeSession.equalsIgnoreCase(code)) {
- // 验证码通过
- } else {
- log.error("验证码错误");
- throw new BussinessException("ERR-06019");
- }
- }
工具类:
- import java.awt.Color;
- import java.awt.Font;
- import java.awt.Graphics;
- import java.awt.image.BufferedImage;
- import java.util.Random;
- /**
- * 验证码生成工具
- * @author HXL
- *
- */
- public class CaptchaUtil {
- private BufferedImage image;// 图像
- private String str;// 验证码
- private static char code[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789".toCharArray();
- public static final String SESSION_CODE_NAME="code";
- private CaptchaUtil() {
- init();// 初始化属性
- }
- /*
- * 取得RandomNumUtil实例
- */
- public static CaptchaUtil Instance() {
- return new CaptchaUtil();
- }
- /*
- * 取得验证码图片
- */
- public BufferedImage getImage() {
- return this.image;
- }
- /*
- * 取得图片的验证码
- */
- public String getString() {
- return this.str;
- }
- private void init() {
- // 在内存中创建图象
- int width = 85, height = 20;
- BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
- // 获取图形上下文
- Graphics g = image.getGraphics();
- // 生成随机类
- Random random = new Random();
- // 设定背景色
- g.setColor(getRandColor(200, 250));
- g.fillRect(0, 0, width, height);
- // 设定字体
- g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
- // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
- g.setColor(getRandColor(160, 200));
- for (int i = 0; i < 155; i++) {
- int x = random.nextInt(width);
- int y = random.nextInt(height);
- int xl = random.nextInt(12);
- int yl = random.nextInt(12);
- g.drawLine(x, y, x + xl, y + yl);
- }
- // 取随机产生的认证码(4位数字)
- String sRand = "";
- for (int i = 0; i < 4; i++) {
- String rand = String.valueOf(code[random.nextInt(code.length)]);
- sRand += rand;
- // 将认证码显示到图象中
- g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
- // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
- g.drawString(rand, 13 * i + 6, 16);
- }
- // 赋值验证码
- this.str = sRand;
- // 图象生效
- g.dispose();
- // ByteArrayInputStream input = null;
- // ByteArrayOutputStream output = new ByteArrayOutputStream();
- // try {
- // ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);
- // ImageIO.write(image, "JPEG", imageOut);
- // imageOut.close();
- // input = new ByteArrayInputStream(output.toByteArray());
- // } catch (Exception e) {
- // System.out.println("验证码图片产生出现错误:" + e.toString());
- // }
- // this.image = input
- this.image = image;/* 赋值图像 */
- }
- /*
- * 给定范围获得随机颜色
- */
- private Color getRandColor(int fc, int bc) {
- Random random = new Random();
- if (fc > 255)
- fc = 255;
- if (bc > 255)
- bc = 255;
- int r = fc + random.nextInt(bc - fc);
- int g = fc + random.nextInt(bc - fc);
- int b = fc + random.nextInt(bc - fc);
- return new Color(r, g, b);
- }
- }
最后展示:
javaweb登录验证码的实现的更多相关文章
- Selenium2学习-018-WebUI自动化实战实例-016-自动化脚本编写过程中的登录验证码问题
日常的 Web 网站开发的过程中,为提升登录安全或防止用户通过脚本进行黄牛操作(宇宙最贵铁皮天朝魔都的机动车牌照竞拍中),很多网站在登录的时候,添加了验证码验证,而且验证码的实现越来越复杂,对其进行脚 ...
- Java实现登录验证码
登录验证码 Servlet /* 从请求中获取数据,获取验证码的session的值转为String类型, 销毁,防止返回后验证码不刷新,重新验证成功 判断验证码是否相同(忽略大 ...
- selemiun 自动化测试登录验证码处理
selemiun 自动化测试登录验证码处理 一.软件及插件的安装 1.火狐浏览器版本(55.0(x64 zh-CN):https://www.cnblogs.com/sandysun/p/783811 ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十七):登录验证码实现(Captcha)
登录验证码 登录验证是一般系统都会有的功能,验证的方式也多种多样,比如输入式验证码,拖动式验证条,拖动式验证拼图等等. 我们这里先实现常规的输入验证码的方式,右边显示验证码图片,点击可刷新,左边输入验 ...
- 通过Cookie跳过登录验证码【限cookie不失效有用】
验证码,相信每个写web自动化测试的同学来说,都是个头疼的事,怎么办呢? 方法还是有的,先说今天这种方式,通过cookie绕过登录验证码 思路: 需要你通过抓包工具抓到你登录的cookie 接下来开始 ...
- 登录验证码实现(Captcha)
登录验证码 登录验证是一般系统都会有的功能,验证的方式也多种多样,比如输入式验证码,拖动式验证条,拖动式验证拼图等等. 我们这里先实现常规的输入验证码的方式,右边显示验证码图片,点击可刷新,左边输入验 ...
- Python - WebDriver 识别登录验证码
Python - WebDriver 识别登录验证码 没什么可说的直接上代码! #-*-coding:utf-8-*- # Time:2017/9/29 7:16 # Author:YangYangJ ...
- 基于ajax 的 几个例子 session ,ajax 实现登录,验证码 ,实现ajax表单展示
headers: {"X-CSRFToken": $("[name='csrfmiddlewaretoken']").val()},data:$(". ...
- 15.Python实现识别登录验证码(入门)
1.若想识别登录验证码,需要安装:Tesseract-OCR,其下载地址为:http://jaist.dl.sourceforge.net/project/tesseract-ocr-alt/tess ...
随机推荐
- [TensorFlow 2] [Keras] fit()、fit_generator() 和 train_on_batch() 分析与应用
前言 是的,除了水报错文,我也来写点其他的.本文主要介绍Keras中以下三个函数的用法: fit()fit_generator()train_on_batch()当然,与上述三个函数相似的evalua ...
- Python3学习(18)--偏函数(Partial) --转载存地址
由于最近出差,没有时间更, 倒不是忙,而是费心,项目其实并不难,主要是涉及钱的地方谈技术略显苍白:没有技术解决不了的问题,但是钱没到位,没人愿意无偿给你提供技术,算是停更一周后的,吐槽吧. 赶上今天 ...
- vue中修改了数据但视图无法更新的情况(转)
原文地址:https://blog.csdn.net/qq_39985511/article/details/79778806
- Ubuntu解压缩rar格式文件
解压缩rar文件时,出现问题 解决方法: sudo apt-get install unrar
- 重读ORB_SLAM之LoopClosing线程难点
1. DetectLoop 这里有个ConsistenGroup概念,比较难懂.这里是最让人迷惑的地方.一旦vbConsistentGroup为真,其他帧的spCanditateGroup就进不来了. ...
- keepalive+nginx
1Nginx+keepAlived负载均衡高可用1.1Nginx+keepAlive架构图 1.1.1主机宕机 1.1.2主机恢复 1.1.3高可用环境 两台nginx,一主一备:192.168.10 ...
- 使用 lombok 简化代码
使用前的准备 1.Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO).它通过注解实现这一目的. <1>添加 ...
- Java script-1
什么是JavaScript? JavaScript是一种直译式脚本语言,一种轻量级的脚本语言. 什么是脚本语言? Script language指的是它不具备开发操作系统的能力,而是只用来编写控制其他 ...
- elasticsearch 分析器 分词器
参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html 在全文搜索(Fu ...
- ThinkPhp学习
页面跳转 界面跳转是很常用的操作,所以基于ubuntu16系统,这周学习了ThinkPHP页面跳转和重定向. 页面跳转 系统的Think\Controller类内置了两个页面跳转方法err ...