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 ...
随机推荐
- 转:Java中的String,StringBuilder,StringBuffer三者的区别
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
- spark program guide
概述 Spark 应用由driver program 组成,driver program运行用户的主函数,在集群内并行执行各种操作 主要抽象RDD: spark提供RDD,是贯穿整个集群中所有节点的分 ...
- IE9样式错乱,IE11无法正常加载v-loading等问题 引入了babel-polyfill插件,依然出现”polyfill-eventsource added missing EventSource to window”的奇怪问题(ie所有版本都有出现)
第一步:安装babel-ployfill (已安装请跳过此步骤) yarn add babel-ployfill 修改webpack打包配置文件:webpack.bash.conf.js // 引入b ...
- UVA140-Bandwidth(搜索剪枝)
Problem UVA140-Bandwidth Time Limit: 3000 mSec Problem Description Given a graph (V, E) where V is ...
- python装饰器(备忘)
# 装饰器decorator def deco1(fun): def PRINT(*args,**kwargs): print('------deco1------') fun(*args,**kwa ...
- WPF Binding学习(三)
转自;http://blog.csdn.net/lisenyang/article/details/18312199 1.控件与控件间的双向绑定 WPF还支持控件作为数据源, <TextBox ...
- 1、FreeRTOS移植
1.FreeRTOS目录结构 FreeRTOS FreeRTOS简略目录如下: ├─FreeRTOS │ ├─Demo // 各种开发工具的完整Demo,开发者可以方便的以此搭建出自己的项目,甚至直接 ...
- 在WinForm应用程序中快速实现多语言的处理(2)--开发框架模块的整合
我在上篇随笔<在WinForm应用程序中快速实现多语言的处理>里面介绍了Winform开发中多语言的处理解决方案,整个多语言解决方案是以实际需求为驱动,以减少代码改动,高效处理为目的,通过 ...
- 下面哪项技术可以用在WEB开发中实现会话跟踪实现?
下面哪项技术可以用在WEB开发中实现会话跟踪实现? A:session B:Cookie C:地址重写 D:隐藏域 答案:ABCD 会话跟踪是一种灵活.轻便的机制,它使Web上的状态编程变为可能. H ...
- @vue/cli 3 打包文件读取绝对路径处理
@vue/cli 3 封装了 webpack.config.js,一般都在 vue.config.js 里面配置,官网不推荐在 webpack 的 output 处理,这里踩了一下坑,希望可以帮到后面 ...