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 验证码详解的更多相关文章

  1. Java内部类详解

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

  2. 黑马----JAVA迭代器详解

    JAVA迭代器详解 1.Interable.Iterator和ListIterator 1)迭代器生成接口Interable,用于生成一个具体迭代器 public interface Iterable ...

  3. C++调用JAVA方法详解

    C++调用JAVA方法详解          博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...

  4. Java虚拟机详解----JVM常见问题总结

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. [转] Java内部类详解

    作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...

  6. Java面向对象详解

    Java面向对象详解 前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学 过的基础知识的想法.一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵 ...

  7. 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 ...

  8. java 泛型详解(普通泛型、 通配符、 泛型接口)

    java 泛型详解(普通泛型. 通配符. 泛型接口) JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能---- ...

  9. Java synchronized 详解

    Java synchronized 详解 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 1.当两个并发线程访问同一个对象object ...

随机推荐

  1. 【Linux基础】文件处理实例

    1.文件拆分 //每4000行拆分一个文件 epms_t_ep_fx_stl_xy_20190129.dat 2.行处理 //查找第二列为711611且第三列为711100记录,打印行号和整行数据 a ...

  2. nginx: [emerg] unknown directive "stub_status" in /usr/local/openresty/nginx/conf/conf.d/ngx_metric.conf:19

    问题分析 Nginx没有添加modules/ngx_http_stub_status_module.o模块. 问题解决 没有安装的话,可以在tar包安装编译的时候添加如下参数: # ./configu ...

  3. Architecture of SQLite

    Introduction This document describes the architecture of the SQLite library. The information here is ...

  4. centos7下kubernetes(8.kubernetes Failover)

    上一节我们运行的3个容器 其中有两个是运行在node2上一个运行在node1上,现在我们关闭node1,观察node1上的容器会发生什么变化 目前node1已经处于notready状态 现在我们查看一 ...

  5. [matlab] 22.matlab图论实例 最短路问题与最小生成树 (转载)

    最短路问题之 Floyd 某公司在六个城市 c1c1,c2c2,….,c6c6 中有分公司,从 cici 到 cjcj 的直接航程票价记在下述矩阵的 (ii,jj) 位置上. (∞∞表示无直接航路), ...

  6. redis在.net架构中的应用(1)--使用servicestack连接redis

    引言:作为少有的.net架构下的大型网站,stackoverflow曾发表了一篇文章,介绍了其技术体系,原文链接http://highscalability.com/blog/2011/3/3/sta ...

  7. Spring batch

    学习了解 https://www.ibm.com/developerworks/cn/java/j-lo-springbatch1/index.html?ca=drs-#ibm-pcon

  8. Linux:Day8(下) RAID

    RAID:Redudant Arrays of Inexpensive(Independent) Disks    廉价(独立)冗余磁盘阵列 提高IO能力:磁盘并行读写: 提高耐用性:磁盘冗余来实现: ...

  9. JSoup抓取本地页面

    File in = new File("C:/Users/li/Desktop/2.html"); Document doc01 = Jsoup.parse(in, "U ...

  10. ORA-00600: internal error code, arguments: [2662]

    转自 http://www.eygle.com/archives/2005/12/oracle_diagnostics_howto_deal_2662_error.html 在ORA-00600 22 ...