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. 【大数据技术】Hadoop三大组件架构原理(HDFS-YARN-MapReduce)

    目前,Hadoop还只是数据仓库产品的一个补充,和数据仓库一起构建混搭架构为上层应用联合提供服务. Hadoop集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起. ...

  2. (转)Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例

    http://www.ityouknow.com/springboot/2017/09/23/spring-boot-jpa-thymeleaf-curd.html 这篇文章介绍如何使用 Jpa 和 ...

  3. 1.03-get_params2

    import urllib.request import urllib.parse import string def get_params(): url = "http://www.bai ...

  4. centos7+nginx负载均衡Tomcat服务

    接着上一篇:www.cnblogs.com/lkun/p/8252815.html 我们在上一篇在一台centos7服务器上部署了两个nginx,接下来我们使用一个nginx实现tomcat的负载均衡 ...

  5. vue的过滤器语发及应用案例

    1.使用地方: 双花括号插值处或  组件属性处   例: {{ message | capitalize }} <div v-bind:id="rawId | formatId&quo ...

  6. 水题:P2799 国王的魔镜

    思路:简单模拟即可.判断一下是不是回文,是回文看长度是不是偶数.是偶数的话,说明又可能是回文.依次这样处理.但是只要长度为奇数则一定是原来的长度直接输出即可. #include<iostream ...

  7. tomcat 安装配置部署到nginx+tomcat+https

    目录 1 Tomcat简介 2.下载并安装Tomcat服务 2.2 部署java环境 2.3 安装Tomcat 2.4 Tomcat目录介绍 (关注点 bin conf logs webapps) 2 ...

  8. Python 使用 distutils 工具安装的扩展包的卸载

    Python 编写完扩展包并 build 好后,可以采用 $ sudo ./setup.py install 安装.采用这种方式安装的扩展包,可以使用 pip list 查看到,但不能直接使用 pip ...

  9. Node.js之mysql增删改查

    1.安装库 npm install mysql 2.编写db.js(用作公共模块) //连接MySQL数据库 var mysql = require("mysql"); var p ...

  10. package-info.java的使用

    一.引入 上文中,提到了注解类JyzTargetPackage可以定义为@Target(ElementType.PACKAGE),可是在被注解类里我无论怎么加,编译器都报错,于是引入了package- ...