没有验证码带来的问题

  1. 对特定用户不断登录破解密码。
  2. 对某个网站创建账户。
  3. 对某个网站提交垃圾数据。
  4. 对某个网站刷票。

 通过验证码由用户肉眼识别其中的验证码信息,从而区分用户是人还是计算机。

定义:

  • 验证码(CAPTCHA):是一种区分用户是计算机还是人的公共全自动程序。
  • 作用:防止恶意破解密码、刷票、论坛灌水,防止黑客暴力破解。

使用Servlet实现验证码

实现图片验证码类GenerateImageCodeServlet.java

GenerateImageCodeServlet.java

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Date;
import java.util.Random; import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class GenerateImageCodeServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final char[] CH = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();
private static final int IMAGE_WIDTH = 73;
private static final int IMAGE_HEIGHT = 28;
private static final int LINE_NUM = 30;
private static final int RANDOM_NUM = 4;
Random random = new Random(); @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpg");//设置相应类型,告诉浏览器输出的内容为图片
response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expire", new Date().getTime()); BufferedImage bi = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_BGR);
Graphics g = bi.getGraphics();
g.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
g.setColor(getRandomColor(110, 133));
g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));
// 绘制干扰线
for (int i = 1; i <= LINE_NUM; i++) {
int x = random.nextInt(IMAGE_WIDTH);
int y = random.nextInt(IMAGE_HEIGHT);
int xl = random.nextInt(13);
int yl = random.nextInt(15);
g.drawLine(x, y, x + xl, y + yl);
} // 绘制随机字符
StringBuilder sb = new StringBuilder();
String str = null;
for (int i = 0; i < RANDOM_NUM; i++) {
g.setFont(new Font("Fixedsys", Font.CENTER_BASELINE, 18));
g.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121)));
str = CH[random.nextInt(CH.length)] + "";
g.drawString(str, 13 * i, 16);
g.translate(random.nextInt(3), random.nextInt(3));
sb.append(str);
}
g.dispose();
request.getSession().setAttribute("safeCode", sb.toString());
ImageIO.write(bi, "JPG", response.getOutputStream());
} /**
* 获得颜色
*/
private Color getRandomColor(int fc, int bc) {
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc - 16);
int g = fc + random.nextInt(bc - fc - 14);
int b = fc + random.nextInt(bc - fc - 18);
return new Color(r, g, b); } }

登录验证LoginServlet.java

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=gbk"); String safeCode = (String) req.getSession().getAttribute("safeCode");
String checkcode = req.getParameter("checkcode"); PrintWriter out = resp.getWriter(); if (safeCode.equalsIgnoreCase(checkcode)) {
out.println("验证码正确");
}
else {
out.println("验证码错误");
}
out.flush();
out.close();
} }

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <servlet>
<servlet-name>ImageCodeServlet</servlet-name>
<servlet-class>com.lijy.servlet.GenerateImageCodeServlet</servlet-class>
</servlet> <servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.lijy.servlet.LoginServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>ImageCodeServlet</servlet-name>
<url-pattern>/safe_code</url-pattern>
</servlet-mapping> <servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> </web-app>

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>checkcodes</title>
<script type="text/javascript">
function reloadCode() {
var time = new Date().getTime();
document.getElementById("imagecode").src="<%=request.getContextPath()%>/safe_code?d="+time;
}
</script>
</head>
<body> <form action="<%=request.getContextPath()%>/login" method="get">
验证码:<input type="text" name="checkcode" />
<img alt="验证码" id="imagecode" src="<%=request.getContextPath()%>/safe_code">
<a href="javascript:reloadCode();">看不清楚</a><br/>
<input type="submit" value="提交" />
<hr> </form> </body>
</html>

页面截图

使用Servlet实现验证码的更多相关文章

  1. jsp使用servlet实现验证码

    在进行表单设计中,验证码的增加恰恰可以实现是否为“人为”操作,增加验证码可以防止网站数据库信息的冗杂等... 现在,小编将讲述通过servlet实现验证码: 验证码作为一个图片,在页面中为“画”出来的 ...

  2. servlet生成验证码

    1.因为朋友们都说现在很少用java自带的图形用户接口,所以小白的我就没去看awt和swing组件,因为要抓紧时间学习后面的,完了出去找工作,等以后再回来了解awt和swing:所以制作验证码的代码是 ...

  3. 转: 通过Servlet生成验证码图片

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(九)—— 通过Servlet生成验证码图片 一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedIma ...

  4. servlet实现验证码

    (博客内容来自:jsp使用servlet实现验证码,以下内容只是不才对原博客的摘抄以便以后翻阅使用) 一.原理: 验证码作为一个图片,在页面中为“画”出来的,它是如何画出来的呢? <生成图片&g ...

  5. java web学习总结(九) -------------------通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  6. JavaWeb---总结(九)通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片  1 package gacl. ...

  7. javaweb学习总结(九)—— 通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  8. java web 学习九(通过servlet生成验证码图片)

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  9. 通过Servlet生成验证码图片

    原文出自:http://www.cnblogs.com/xdp-gacl/p/3798190.html 一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类, ...

随机推荐

  1. 半径R覆盖最多点

    struct point { double x, y; }; point p[N]; struct alpha { double v; bool flag; bool friend operator ...

  2. Understanding the Transform Function in Pandas

    Understanding the Transform Function in Pandas 来源 What is transform? 我在 Python Data Science Handbook ...

  3. java 基础类型和包装类的详解

    摘自:JAVA中基本类型的包装类 1. 包装类把基本类型数据转换为对象     每个基本类型在java.lang包中都有一个相应的包装类 2. 包装类有何作用     提供了一系列实用的方法     ...

  4. TreeMap、HashMap、LindedHashMap的区别

    LinkedHashMap可以保证HashMap集合有序.存入的顺序和取出的顺序一致.TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器 ...

  5. Java缓存技术有哪些

    我们用ehcache在本地,分布式用redis和memcache,各有各的好处,现在企业都是应用很多种中间件供俺们码农选择.

  6. 20175215 2018-2019-2 第二周java课程学习总结

    一.学生免费申请使用IDEA 下载好IDEA后,设置到最后有一个界面, 我们需要到IDEA官网进行IDEA免费试用权的申请,如果有学校的邮箱,使用学校的邮箱注册并证明是自己的就可以直接通过申请.如下图 ...

  7. heigth innerheigt outerheight详解

    height() :height innerHeight(): height + paddingouterHeight(): height + padding + border outerHeight ...

  8. leetcode 166分数到小数

    手动排除特殊情况: 对于一般情况,使用位运算和加减法来计算除法,使用sign记录结果符号:(这部分为leetcode 29题的答案) 使用hashmap来记录循环体出现的开始位置(如果有的话),使用f ...

  9. 【转】JS正则验证邮手机、箱等格式

    function test() { var temp = document.getElementById("text1"); //对电子邮件的验证 var myreg = /^([ ...

  10. 远程连接mysql要点 虚拟主机定义与分类

    远程连接mysql:通过主机地址与端口号连接 1. 主机地址:找到主机电脑 2. 端口号:找到对应mysql软件 mysql客户端访问服务端需要进行寻找匹配:连接认证-h 主机地址 例如 -hloca ...