`
EmarMandy
  • 浏览: 8194 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

网站验证码生成

    博客分类:
  • java
阅读更多

为了防止用户恶意,或者使用软件外挂提交一些内容,就得用验证码来阻止,虽然这个会影响用户体验,但为了避免一些问题很多网站都使用了验证码;今天下午参考文档弄了一个验证码,这里分享一下;这是一个web工程,首先是页面,这里只是一个显示验证码页面index.jsp,使用默认生成的就可以了,表单没有做提交,如下

复制代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>验证码</title>
    <script type="text/javascript">
    function refresh(obj) {
        obj.src = "imageServlet?"+Math.random();
    }
    </script>
  </head>
  <body>
    <form action="checkServlet" method="post">
        <label>输入验证码</label><br/>
        <input type="text" name="randomCode"/><img title="点击更换" onclick="javascript:refresh(this);" src="imageServlet"><br/>
        <input type="submit" value="submit">
    </form>
  </body>
</html>
复制代码

下面是后台代码,这里是一个Servlet,不要忘记在web.xml中配置请求url

View Code
package com.wf.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ImageServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片
        response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expire", 0);
        RandomValidateCode randomValidateCode = new RandomValidateCode();
        try {
            randomValidateCode.getRandcode(request, response);//输出图片方法
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

这个类是生成验证码的方法,如下

View Code
复制代码
package com.wf.web;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class RandomValidateCode {

    public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key
    private Random random = new Random();
    private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串
    
    private int width = 80;//图片宽
    private int height = 26;//图片高
    private int lineSize = 40;//干扰线数量
    private int stringNum = 4;//随机产生字符数量
    /*
     * 获得字体
     */
    private Font getFont(){
        return new Font("Fixedsys",Font.CENTER_BASELINE,18);
    }
    /*
     * 获得颜色
     */
    private Color getRandColor(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);
    }
    /**
     * 生成随机图片
     */
    public void getRandcode(HttpServletRequest request,
            HttpServletResponse response) {
        HttpSession session = request.getSession();
        //BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
        Graphics g = image.getGraphics();//产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
        g.fillRect(0, 0, width, height);
        g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));
        g.setColor(getRandColor(110, 133));
        //绘制干扰线
        for(int i=0;i<=lineSize;i++){
            drowLine(g);
        }
        //绘制随机字符
        String randomString = "";
        for(int i=1;i<=stringNum;i++){
            randomString=drowString(g,randomString,i);
        }
        session.removeAttribute(RANDOMCODEKEY);
        session.setAttribute(RANDOMCODEKEY, randomString);
        System.out.println(randomString);
        g.dispose();
        try {
            ImageIO.write(image, "JPEG", response.getOutputStream());//将内存中的图片通过流动形式输出到客户端
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /*
     * 绘制字符串
     */
    private String drowString(Graphics g,String randomString,int i){
        g.setFont(getFont());
        g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
        String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));
        randomString +=rand;
        g.translate(random.nextInt(3), random.nextInt(3));
        g.drawString(rand, 13*i, 16);
        return randomString;
    }
    /*
     * 绘制干扰线
     */
    private void drowLine(Graphics g){
        int x = random.nextInt(width);
        int y = random.nextInt(height);
        int xl = random.nextInt(13);
        int yl = random.nextInt(15);
        g.drawLine(x, y, x+xl, y+yl);
    }
    /*
     * 获取随机的字符
     */
    public String getRandomString(int num){
        return String.valueOf(randString.charAt(num));
    }
}
复制代码

这里附带吧web.xml也加上吧,希望对初学者有帮助

View Code
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    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_2_5.xsd">
  <servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>com.wf.web.ImageServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/imageServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

就这么多,验证码是保存在session中的,或者cookie也行,但都要必须及时清除

分享到:
评论

相关推荐

    python网站验证码生成和验证下载

    本资源提供的是一个django框架下的网站验证码技术,通过python代码调用PIL库生成图形验证码然后通过json方式将验证码字段和图片通过base64格式传输给前端,前端可以点击更换验证码(不用刷新页面),对输入进行校验...

    Python毕业设计:网站验证码生成与核对系统,兼具 爬虫 与 反爬虫 的系统

    网站验证码生成与核对系统,兼具 爬虫 与 反爬虫 的系统,并有用户前端提供自己编写的爬虫有效性测试。反爬虫主要集中于验证码的生成与核对。 软件架构 系统分为前后端、爬虫两个部分,对应于crawler-web/文件夹和...

    基于python+Django登录网站验证码的生成与识别系统源码数据库.zip

    源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。...

    基于python+Django登录网站验证码的生成与识别系统源码数据库论文.docx

    基于 Python+Django 的登录网站验证码生成与识别系统源码数据库论文 本论文主要研究基于 Python 语言和 Django 框架的登录网站验证码生成与识别系统的设计和实现。该系统的主要目的是为了增强网站的安全性,防止...

    基于python+Django登录网站验证码的生成与识别系统设计与实现.docx

    本文将深入探讨如何使用Python编程语言和Django Web框架来构建一个高效且安全的登录网站验证码生成与识别系统。 1. 研究背景 随着互联网技术的飞速发展,网络安全问题日益凸显。验证码作为网站安全的重要防线,需要...

    图片验证码生成demo

    总之,图片验证码是网站和应用程序安全的重要组成部分,"图片验证码生成demo"是一个实践性的学习资源,可以帮助你掌握验证码的生成技术和原理。通过深入研究和实践,你将能够创建自己的定制化验证码解决方案,以适应...

    验证码生成类-最好用的

    验证码生成类是IT领域中一个重要的安全机制,主要用于防止恶意自动化程序或机器人对网站或应用程序进行非法操作。在本文中,我们将深入探讨验证码生成类的相关知识点,并基于提供的文件信息进行详细解析。 首先,...

    表单验证码生成_js

    本篇文章将详细讲解基于JavaScript(js)实现的表单验证码生成技术,以及如何自定义字符并创建高效实例。 验证码的核心功能是生成一组随机的、难以被程序自动识别的字符序列,通常包括字母、数字、甚至图形。...

    登录网站验证码的生成与识别系统(django)源码&python毕业设计.zip

    该压缩包包含的是一个基于Python和Django框架的登录网站验证码生成与识别系统的源代码,适合用作Python或Django的毕业设计或课程设计项目。验证码系统在网站安全中起着至关重要的作用,它用于验证用户是否是真实的人...

    一个php验证码生成类代码.zip

    验证码(CAPTCHA)是一种用于验证用户是否为人类的机制,常用于防止自动化...总的来说,这个PHP验证码生成类提供了一种简洁高效的方式来创建安全的图像验证码,可以广泛应用于各种Web应用中,保护网站免受自动化攻击。

    轻量级验证码生成工具

    本篇将详细探讨“轻量级验证码生成工具”——一个基于Java的验证码生成插件。 该插件设计的目标是轻便且易于集成,它内置了四种不同的验证码样式,可以满足各种应用场景的需求。这些样式可能包括不同颜色、字体、...

    验证码生成

    验证码生成是一种常见的安全措施,用于防止自动化程序(如机器人)对网站进行恶意操作,例如注册、登录或提交表单。验证码通常包含随机生成的一串字符,可能是数字、字母或者符号,用户需要正确输入这些字符才能完成...

    .NET验证码生成组件

    .NET验证码生成组件是一种用于Web应用的安全机制,旨在防止自动化程序(如机器人)对网站进行恶意...通过以上知识点的掌握和实践,开发者能够有效地将这个.NET验证码生成组件整合到自己的Web应用中,提高网站的安全性。

    java jcaptcha 验证码 生成

    Java JCaptcha验证码生成详解 验证码(CAPTCHA)是一种防止机器自动操作的安全机制,它通过让用户输入图片或音频中显示的随机字符来验证用户是否为真实的人。在Java开发中,JCaptcha是一个广泛使用的开源库,它提供...

    C# 如何自动生成验证码(Web图形验证码生成示例),相信好多人有要用哦(源码)

    本文将详细介绍如何使用C#自动生成Web图形验证码,以及提供一个简单的5位数字验证码生成示例。 首先,理解验证码的基本概念:验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and...

    python3中图片验证码生成程序

    下面将详细介绍这个验证码生成程序的关键知识点。 首先,验证码的核心在于随机性和复杂性,确保它既难于机器识别,又易于人类辨认。Python中的`Pillow`库是`PIL`(Python Imaging Library)的一个分支,它提供了...

    .net 生成验证码 代码 页面

    .NET框架提供了一种高效的方法来生成验证码,以增强网站的安全性,防止自动化脚本或机器人进行非法操作。验证码(CAPTCHA)是一种通过图形图像...同时,要注意定期更换验证码生成策略,以应对可能的自动化破解尝试。

Global site tag (gtag.js) - Google Analytics