Java 验证码详解
1 使用Servlet实现验证码,涉及的知识点主要为java 绘图技术与session保存数据。
HTML页面
<html>
<image src='images/logo1.jpg' /><hr/>
<head><br/><title>登录</title> <br/><h1> 欢迎登录</h1></head>
<body>
<form action='/LoginValid/LoginVerify' method='post' >
用户id:<input type='text' name='userid' value=''>
用户密码:<input type='password' name='password' value=''>
验证码:<input type='text' name='inputCode' /> <img id='imgObj' src='/LoginValid/CreateCode2' /><a href='javascript:changeImg()' >换一张</a>
<input type='submit' value='登录' />
</form>
</body>
<script type='text/javascript'>
function changeImg() {
var time = new Date();
document.getElementById('imgObj').src='/LoginValid/CreateCode2?d='+time;
}
</script>
</html>
生成验证码的工具类
public class CodeUtil {
//图片宽度
private static final int IMG_W=120;
//图片高度
private static final int IMG_H=30;
//验证码字符个数
private static final int NUM_CHS=5;
//验证码包含的具体字符
private static char[] chs = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890".toCharArray();
private static Random rand = new Random();
//图片x轴,y轴的位置基数
private static int codeX = 20;
private static int codeY = 25;
//字体大小
private static int fontH = 25;
public static Map<String, Object> generateImage()
{
BufferedImage image = new BufferedImage(IMG_W, IMG_H, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
//设置图片背景色为白色
g.setColor(Color.WHITE);
g.fillRect(0, 0, IMG_W, IMG_H);
//设置字体大小
Font font = new Font("Fixedsys", Font.BOLD, fontH);
g.setFont(font);
//画边框
g.setColor(Color.BLACK);
g.drawRect(0, 0, IMG_W, IMG_H);
g.setColor(Color.BLACK);
//随机产生30条干扰线
for(int i=0; i<30; i++)
{
int x = rand.nextInt(IMG_W);
int y = rand.nextInt(IMG_H);
int xl = rand.nextInt(20);
int yl = rand.nextInt(20);
g.drawLine(x, y, xl, yl);
}
StringBuilder sb = new StringBuilder();
for(int i=0; i<NUM_CHS; i++)
{
//从字符串中随机获取一个字符
String code = String.valueOf(chs[rand.nextInt(chs.length)]);
//随机设置画笔颜色
g.setColor(new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255)));
g.drawString(code, (i+1)*codeX, codeY);
sb.append(code);
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("code", sb.toString());
map.put("codeImage", image);
return map;
}
}
后台产生验证码的Servlet
//禁止浏览器缓存随机图片
response.setDateHeader("Expires",-1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache"); //通知客户端以图片的方式打开发送过去的数据
response.setHeader("Content-Type", "image/jpeg"); Map<String, Object> map = CodeUtil.generateImage();
//将验证码保存至session
request.getSession().setAttribute("checkCode", map.get("code"));
ImageIO.write((RenderedImage)map.get("codeImage"), "jpg", response.getOutputStream());
后台验证用户输入的验证码与显示的是否一致的Servlet类
HttpSession session = request.getSession();
String seCode = (String)session.getAttribute("checkCode");
String inputCode = (String)request.getParameter("inputCode");
if(seCode.equals(inputCode))
{
request.getRequestDispatcher("/Main").forward(request, response);
}
else
{
request.getRequestDispatcher("/Err").forward(request, response);
}
博客参考:https://www.cnblogs.com/nanyangke-cjz/p/7049281.html
Java 验证码详解的更多相关文章
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
- 黑马----JAVA迭代器详解
JAVA迭代器详解 1.Interable.Iterator和ListIterator 1)迭代器生成接口Interable,用于生成一个具体迭代器 public interface Iterable ...
- C++调用JAVA方法详解
C++调用JAVA方法详解 博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...
- Java虚拟机详解----JVM常见问题总结
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- [转] Java内部类详解
作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...
- Java面向对象详解
Java面向对象详解 前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学 过的基础知识的想法.一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵 ...
- java 乱码详解_jsp中pageEncoding、charset=UTF -8"、request.setCharacterEncoding("UTF-8")
http://blog.csdn.net/qinysong/article/details/1179480 java 乱码详解__jsp中pageEncoding.charset=UTF -8&quo ...
- java 泛型详解(普通泛型、 通配符、 泛型接口)
java 泛型详解(普通泛型. 通配符. 泛型接口) JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能---- ...
- Java synchronized 详解
Java synchronized 详解 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 1.当两个并发线程访问同一个对象object ...
随机推荐
- HTTP Health Checks
This article describes how to configure and use HTTP health checks in NGINX Plus and open source NGI ...
- 【BZOJ2117】 [2010国家集训队]Crash的旅游计划
[BZOJ2117] [2010国家集训队]Crash的旅游计划 Description 眼看着假期就要到了,Crash由于长期切题而感到无聊了,因此他决定利用这个假期和好友陶陶一起出去旅游. Cra ...
- 如何在python中把两个列表的各项分别合并为列表
[ [a,b] for a,b in zip(list1,list2)] 生成一个以列表list1,list2各项合并列表为元素的列表
- I/O 机制的介绍(Linux 中直接 I/O 机制的介绍)
IO连接的建立方式 1.缓存IO.流式IO: 2.映射IO.块式IO: 3.直接IO. IO的方式: 同步.异步.定时刷新: MMAP与内核空间 mmap使用共享用户空间与内核空间实现: 直接 I/O ...
- SQLite的sqlite3_prepare_v2
original SQL text---<sqlite3_prepare_v2>--->sqlite3_stmt--<sqlite3_reset>-->clear ...
- redis加锁
1. redis加锁分类 redis能用的的加锁命令分表是INCR.SETNX.SET2. 第一种锁命令INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 ...
- [HAOI2018]染色
嘟嘟嘟 这题当时没想出来(因为本人实在不太擅长计数),然后又被luogu的第一篇题解吓怕了,就咕了一小段时间再写. 其实这题不是很难. 做法就是基础容斥+NTT. 首先出现\(S\)次的颜色最多有\( ...
- 【vue】vue +element 实现批量删除
相关资料:http://blog.csdn.net/eagle_88/article/details/70238836 作者:smile.轉角 QQ:493177502
- pyQT4和pyQT5的主要模块介绍
下面简单介绍一下pyQT4和pyQT5的主要模块 pyQT4 的主要模块 QtCore 模块包括了核心的非GUI功能,该模块用来对时间.文件.目录.各种数据类型.流.网址.媒体类型.线程或进程进行处理 ...
- Jmeter+ant+jenkins集成
已有jmeter.*.jmx脚本 一.jmeter+ant 1.下载安装ant(检查是否安装成功) 2.将 JMeter 所在目录下 extras 子目录里的 ant-JMeter-1.1.1.jar ...