ImageServlet.java

  1. package cn.hist.test.servlet;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.Graphics;
  6. import java.awt.image.BufferedImage;
  7. import java.io.IOException;
  8. import java.util.Random;
  9.  
  10. import javax.imageio.ImageIO;
  11. import javax.servlet.http.HttpServlet;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import javax.servlet.http.HttpSession;
  15.  
  16. public class ImageServlet extends HttpServlet{
  17.  
  18. // 生成随机颜色
  19. Color getRandColor(int fc, int bc) {
  20. Random random = new Random();
  21. if (fc > 255)
  22. fc = 255;
  23. if (bc > 255)
  24. bc = 255;
  25. int r = fc + random.nextInt(bc - fc);
  26. int g = fc + random.nextInt(bc - fc);
  27. int b = fc + random.nextInt(bc - fc);
  28. return new Color(r, g, b);
  29. }
  30.  
  31. public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
  32. HttpSession session = request.getSession();
  33. // 设置图形验证码中字符串的字体和大小
  34. Font myFont = new Font("", Font.PLAIN, 25);
  35. // 阻止生成的页面内容被缓存,保证每次重新生成随机验证码
  36. response.setHeader("Pragma", "No-cache");
  37. response.setHeader("Cache-Control", "no-cache");
  38. response.setDateHeader("Expires", 0);
  39. response.setContentType("image/jpeg");
  40. // 指定图形验证码图片的大小
  41. int width = 64, height = 41;
  42. // 生成一张新图片
  43. BufferedImage image=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
  44. Graphics g=image.getGraphics(); //通过缓冲区创建一个画布
  45. Random random = new Random();
  46. g.setColor(getRandColor(200, 250));//为画布创建背景颜色
  47. g.fillRect(0, 0, width,height); //fillRect:填充指定的矩形
  48. g.setColor(new Color(82, 82, 82)); //字体颜色
  49. //g.drawRect(0, 0, width - 1, height - 1); //产生边框
  50. g.setFont(myFont);
  51. // 随机生成线条,让图片看起来更加杂乱
  52. g.setColor(getRandColor(160, 200));
  53. for (int i = 0; i < 155; i++) {
  54. int x = random.nextInt(width - 1);// 起点的x坐标
  55. int y = random.nextInt(height - 1);// 起点的y坐标
  56. int x1 = random.nextInt(6) + 1;// x轴偏移量
  57. int y1 = random.nextInt(12) + 1;// y轴偏移量
  58. g.drawLine(x, y, x + x1, y + y1);
  59. }
  60. // 随机生成线条,让图片看起来更加杂乱
  61. for (int i = 0; i < 70; i++) {
  62. int x = random.nextInt(width - 1);
  63. int y = random.nextInt(height - 1);
  64. int x1 = random.nextInt(12) + 1;
  65. int y1 = random.nextInt(6) + 1;
  66. g.drawLine(x, y, x - x1, y - y1);
  67. }
  68. // 该变量用来保存系统生成的随机字符串
  69. String sRand = "";
  70. for (int i = 0; i < 6; i++) {
  71. // 取得一个随机字符
  72. String tmp = getRandomChar();
  73. sRand += tmp;
  74. // 将系统生成的随机字符添加到图形验证码图片上
  75. g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
  76. //将验证码显示在图像中
  77. g.drawString(tmp, 15 * i + 3, 30); //字体距左边及上边的距离
  78. }
  79.  
  80. // 将系统生成的图形验证码添加
  81. session.setAttribute("rand", sRand);
  82. g.dispose();
  83. // 输出图形验证码图片
  84. ImageIO.write(image, "JPEG", response.getOutputStream());
  85. }
  86. // 随机生成一个字符
  87. private String getRandomChar() {
  88. int rand = (int) Math.round(Math.random() * 2);// 将0~2的小数四舍五入生成整数
  89. long itmp = 0;
  90. char ctmp = '\u0000';
  91. // 根据rand的值来决定是生成一个大写字母、小写字母和数字
  92. switch (rand) {
  93. // 生成大写字母的情形
  94. case 1:
  95. itmp = Math.round(Math.random() * 25 + 65);
  96. ctmp = (char) itmp;
  97. return String.valueOf(ctmp);
  98. // 生成小写字母
  99. case 2:
  100. itmp = Math.round(Math.random() * 25 + 97);
  101. ctmp = (char) itmp;
  102. return String.valueOf(ctmp);
  103. // 生成数字
  104. default:
  105. itmp = Math.round(Math.random() * 9);
  106. return String.valueOf(itmp);
  107. }
  108. }
  109. }

index.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE html>
  7. <html>
  8. <head>
  9. <meta charset="utf-8">
  10. <base href="<%=basePath%>">
  11. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  12. <title>Test</title>
  13. <link rel="stylesheet" href="">
  14. <script>
  15. //刷新验证码
  16. function refresh() {
  17. var time = new Date().getTime();
  18. document.getElementById("imagecode").src = "ImageServlet?d=" + time;
  19. }
  20. </script>
  21. </head>
  22. <body>
  23. <form action="ImageCompare">
  24. <p>
  25. <label for="icode">验证码</label><input type="text" name="icode"
  26. id="icode" placeholder="请输入验证码" /><img alt="验证码"
  27. id="imagecode" class="imagecode" src="ImageServlet"
  28. onclick="refresh()" /><a href="javascript:void(0);"
  29. onclick="refresh()">看不清?</a>
  30. </p>
  31. </form>
  32. </body>
  33. </html>

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <display-name></display-name>
  7. <welcome-file-list>
  8. <welcome-file>index.jsp</welcome-file>
  9. </welcome-file-list>
  10. <servlet>
  11. <servlet-name>ImageServlet</servlet-name>
  12. <servlet-class>cn.hist.test.servlet.ImageServlet</servlet-class>
  13. </servlet>
  14. <servlet-mapping>
  15. <servlet-name>ImageServlet</servlet-name>
  16. <url-pattern>/ImageServlet</url-pattern>
  17. </servlet-mapping>
  18. </web-app>

ImageCompare.java

  1. package cn.hist.test.servlet;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5.  
  6. import javax.servlet.ServletException;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import javax.servlet.http.HttpSession;
  11.  
  12. /**
  13. * 比较输入的验证码是否正确
  14. * @author Administrator
  15. *
  16. */
  17. public class ImageCompare extends HttpServlet{
  18. @Override
  19. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  20. throws ServletException, IOException {
  21. PrintWriter out = resp.getWriter();
  22. HttpSession session = req.getSession();
  23. // 获取验证码中的字符
  24. String rand = (String) session.getAttribute("rand");
  25. System.out.println(rand);
  26. String icode = req.getParameter("icode");
  27. System.out.println(icode);
  28. if (icode.equals(rand)) {
  29. out.print("success");
  30. }
  31. else {
  32. out.print("fail");
  33. }
  34. }
  35. }

将rand与icode都转换成大写或小写再进行比较,实现输入验证码时不区分大小写

JSP验证码的更多相关文章

  1. jsp验证码 (通过单击验证码或超链接换验证码)

    #code.jsp <%@ page language="java" import="java.util.*" import="java.awt ...

  2. jsp验证码页面笔记

    首先在网上搜了下jsp生成验证码的代码,如下: package com.servlet; import java.awt.Color; import java.awt.Font; import jav ...

  3. jsp验证码点击刷新

    <img src="<%=basePath%>manage/code" alt="验证码" height="20" ali ...

  4. JSP验证码。

    package com; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.aw ...

  5. 生成jsp验证码的代码详解(servlet版)

    package util; import java.util.*; import java.io.*; import java.awt.*; import java.awt.image.*; impo ...

  6. jsp 验证码

    <%@page import="java.awt.Graphics2D"%> <%@page import="java.util.Random" ...

  7. web项目 验证码 *** 最爱那水货

    1. jsp代码 : <Script> function changeImg(){ document.getElementById("certImg").src =&q ...

  8. 手把手教你做JavaWeb项目:登录模块

    现如今,无论是客户端还是移动端,无论是游戏登陆还是社交平台登陆,无处不在的“登陆”.那么你知道怎么制作吗?今天就为你娓娓道来: 用户登录 在各大信息管理系统中,登录功能是必不可少的,他的作用就是验证用 ...

  9. jsp页面验证码(完整实例)

    项目结构如下,MyEclipse中新建一个Web Project,取名servlet 1.src下new一个servlet类 package com.servlet; import java.awt. ...

随机推荐

  1. Linux命令——创建删除文件

    创建文件夹 mkdir filename 进入目录文件 cd filename 返回上一级目录 cd ..返回多级目录   cd ../../.. (../表示一级) 创建文件 touch filen ...

  2. Linux 下 安装 Phalcon

    先安装GIT 然后从 git://github.com/phalcon/cphalcon.git 这里下载安装文件 编译完成就可以安装了! 编译chmod -R 777 cphalcon1. 创建从C ...

  3. Automatically watermark all uploaded photos (给所有上传的相片加水印)

    Hello, This mod automatically watermark all uploaded photos. Price: FREE, enjoy. You will have to ed ...

  4. HDU 5224 Tom and paper(最小周长)

    HDU 5224 Tom and paper(最小周长) Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d &a ...

  5. [Apio2014]回文串

    http://www.lydsy.com:808/JudgeOnline/problem.php?id=3676 这是一道回文树裸题,具体如何建图见http://blog.csdn.net/u0133 ...

  6. Keil C51中变量的使用

    引言 8051内核单片机是一种通用单片机,在国内占有较大的市场份额.在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功.由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用 ...

  7. NOI 2005 维修数列

    妈妈呀我终于过了!!!原来是数据坑我!!! 弃疗弃疗弃疗弃疗!!!!我调了一天呢....被GET_SUM 8 0打败了.... 啥也不说了....还是我太年轻.... 更新了一下常数,跑的还是可以的: ...

  8. winPcap_4_获取已安装设备的高级信息

    由 pcap_findalldevs_ex() 返回的每一个 pcap_if 结构体,都包含一个 pcap_addr 结构体,这个结构体由如下元素组成: 一个地址列表 一个掩码列表 (each of ...

  9. 几何学中的欧拉公式:V-E+F = 2

    几何学中的欧拉公式:V-E+F = 2,V.E.F表示简单几何体的顶点数.边数.面数. 证明: 它的证明有多种,这里呈现一种递归证法. 对于任意简单几何体(几何体的边界不是曲线),我们考察这个几何体的 ...

  10. SVN linux端配置

    1.create a folder:     mkdir /sandbox/svn 2.create svn repository:     svnadmin create /sandbox/svn/ ...