安全机制-验证码实例

  个人理解:验证码主要用于防止暴力破解(如一些刷票神器,抢票助手等)非人为操作一种安全机制。该机制将信息(以字符为主)验证用图片的形式输出到客户端,这样有效防止验证信息元数据的泄露,也有效杜绝了部分非人为操作对系统进行访问。

  如下是验证码实现步骤:

1.编写服务端servlet源码

package com.bao.tools.authenticode;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
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;
import javax.servlet.http.HttpSession;

/**
 * @title 验证码
 * @author Administrator
 * @date 2015-7-18
 */
@SuppressWarnings("serial")
public class Authenticode extends HttpServlet {
    //建立输出验证码字符的集合
    private static String codeChars = "0123456789abcdefghigklmnopqrstuvwxyzACEFMNOPTWXYHG";
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置浏览器缓存
        response.setHeader("ragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        
        int charsLength = codeChars.length();//获得验证码字符的总字符长度
        //设置验证码图像宽和高
        int width = 90;
        int height = 30;
        
        //获得图像缓冲对象(宽,高,颜色值类型)
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //获得画出图像的Graphics对象
        Graphics graphics = image.getGraphics();
        graphics.setColor(getRandomColor(130, 230));//设置填充颜色
        graphics.fillRect(0, 0, width, height);//设置图像背景
        //设置字体
        graphics.setFont(new Font("楷体", Font.BOLD, height));
        graphics.setColor(getRandomColor(5, 239));
        
        //产生随机验证码字符
        Random random = new Random();//产生随机字符对象
        StringBuilder builder = new StringBuilder();//本次验证码字符串
        //验证码随机字体集合
        String[] fontNames ={"宋体","楷体","仿宋","Consolas","Arial"};
        //产生3-5个随机字符
        for(int i=0;i<3+random.nextInt(3);i++){
            //随机设置字符字体
            graphics.setFont(new Font(fontNames[random.nextInt(3)], Font.ITALIC, height));
            graphics.setColor(getRandomColor(50, 200));
            //获得当前字符
            char codeChar = codeChars.charAt(random.nextInt(charsLength));
            builder.append(codeChar);//添加到字符串
            //画出字符(字符串,X轴,Y轴)
            graphics.drawString(String.valueOf(codeChar), 16*i+random.nextInt(6), height-random.nextInt(6));
        }
        //获得HttpSession对象
        HttpSession session = request.getSession();
        session.setMaxInactiveInterval(60);//设置有效时间为60秒
        session.setAttribute("authenticode", builder.toString());
        graphics.dispose();//释放画图对象
        OutputStream os = response.getOutputStream();//获得输出流对象
        ImageIO.write(image, "jpeg", os);//输出图像
    }
    /*
     * 返回一个随机颜色
     */
    private static Color getRandomColor(int min,int max){
        Random random = new Random();//随即函数对象
        //设置RGB三基色色值范围
        if(min>255)min=255;
        if(max>255)max=255;
        
        //设置RGB三基色值
        int red = min+random.nextInt(max-min);
        int green = min+random.nextInt(max-min);
        int blue = min+random.nextInt(max-min);        
        
        return new Color(red,green,blue);
    }
}

2.编写用于显示验证码的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=UTF-8">
<title>用户登录</title>
</head>
<script type="text/javascript">
    //刷新验证码
    function refresh(){
        var img = document.getElementById("authenti");
        img.src="<%=request.getContextPath()%>/authenti?" + Math.random();
    }
</script>
<body>

<!-- 如下是验证码模块 -->
    验证码:
    <input type="text" name="authenicode" maxlength="5"
        style="width: 50px;" />
    <a href="#"><img id="authenti" title="刷新验证码" alt="验证码"
        src="<%=request.getContextPath()%>/authenti" onclick="refresh();"></a>
</body>
</html>

3.配置web.xml(访问servlet类,将代码贴入web-app标签内部)

<!-- 验证码配置 -->
  <servlet>
      <servlet-name>authenticode</servlet-name>
      <servlet-class>com.bao.tools.authenticode.Authenticode</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>authenticode</servlet-name>
      <url-pattern>/authenti</url-pattern>
  </servlet-mapping>
  <!-- 验证码结束 -->

4.发布应用到服务器(本案例为tomcat服务器)

5.启动服务器并访问页面

  至此,验证码功能完成了!

时间: 2024-10-13 22:47:22

安全机制-验证码实例的相关文章

Android开发之UI更新交互机制与实例解析

android开发过程中,经常需要更新UI的状态和文案等.这是就需要对UI进行 更新.在android中更新UI一般有三种方法,handler机制.RunOnUiThread方法以及AsyncTask异步类方法等 本文下面就这三种方法进行了演示和代码实现. a.Handler机制通过使用消息机制来实现 b.RunOnUiThread方法是通过运行UI线程来达到更新UI的目的 c.AsyncTask是异步类,通过异步更新来更新UI 效果图如下:           (1)Java功能实现代码如下:

IOS消息机制应用实例--异常处理

IOS消息机制应用实例--异常处理 最近发现了一个在项目中常用的异常处的工具NullSafe,分析了它的实现原理,不小心发现了一个小Bug,现将其分享出来,关于这篇文章的Demo已经上传至GitHub,看完如有收获,欢迎Star,如有疑问欢迎issue,大家一起学习.在IOS开发中我们可能会遇到下面的情景:服务器给我们返回得某个字段是null,比如someValue:null,这个时候我们利用第三方工具转化之后会得到someValue = <null>,这个时候如果我们判断这个someValu

JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)

1.转发和重定向 HttpServletResponse response 转发: RequestDispatcher dispatcher = request.getRequestDispatcher("/secondServlet"); request.setAttribute("pwd","123");//这里设置的值在secondServlet中可以获取到 dispatcher.forward(request, response);//调

C#生成验证码实例

常用生成验证码实例封装: /// <summary> /// 生成内存位图 /// </summary> /// <param name="Code"></param> /// <returns></returns> public static Bitmap GetCode(out string Code) { int imgWidth = 80; int imgHeight = 40; //获取随机字符 Code

java 反射机制的实例

[案例1]通过一个对象获得完整的包名和类名 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package Reflect; /**  * 通过一个对象获得完整的包名和类名  * */ class Demo{     //other codes... } class hello{     public static void main(String[] args) {         Demo demo=new Demo();         System.out.pri

Android的Handler Looper Message机制应用实例与详解(一)

Android的UI操作不是线程安全的(出于提高性能考虑,避免实现多线程同步等机制所引入的延时),若多个线程同时对UI元素进行操作,可能导致线程安全问题.因此,Android中做了严格的规定:只有UI主线程才能对UI进行设置与操作. 在实际编程中,为了避免UI界面长时间得不到响应而导致的ANR(Application Not Responding)异常,通常将网络访问.复杂运算等一些耗时的操作被放在子线程中执行.这就需要子线程在运行完毕后将结果返回到主线程并通过UI进行显示.在Android中,

Android的Handler Looper Message机制应用实例与详解(二)

上一篇博文给出了Android中基于Handler Looper机制实现线程间通信的两个典型实例.本文将对该机制的基本原理进行较深入的研究.个人认为,学好Android编程最好的老师就是Android的源代码,下面将基于Android-19的源码进行分析,重点阐述分析思路. 要分析Handler Looper机制,自然想到去看Handler类和Looper类的源码(分别位于Handler.java和Looper.java两个文件中).简单阅读两个类的描述后,在Looper类的描述中能找到以下一段

Jquery制作图片验证码实例-canvas 绘制

CSS .identify-code{ position: absolute; right: 6px; top: 50%; width: 118px; height: 40px; margin: -21px 0 0 0; } HTML <span id="code" class="identify-code"> <canvas class="show-captcha" id="canvas" style=&q

windows消息机制与实例

windows发送窗口消息 所需工具:spy++,visual studio 2017,c#语言 技术路线:首先通过spy++获得所要操纵的窗口的句柄,函数的原型声明为: [DllImport("user32.dll")]       public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 此函数获得目标窗口的句柄,如果要获得某个子窗口的句柄,通过以下函数可获得: [DllImpo