springmvc下实现登录验证码功能

总体思路,简单讲,就是后台生成图片同时将图片信息保存在session,前端显示图片,输入验证码信息后提交表单到后台,取出存放在session里的验证码信息,与表单提交的验证码信息核对。

点击验证码图片时,通过jquery重新请求后台生成验证码图片方法,更换图片。

首先在后端controller里,有这样一个方法:

路径为http://localhost:8888/RiXiang_blog/login/captcha.form,访问这个路径便可以通过response写入图片。

    @RequestMapping(value = "/captcha", method = RequestMethod.GET)
    @ResponseBody
    public void captcha(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        CaptchaUtil.outputCaptcha(request, response);
    }

CaptchaUtil是一个工具类,封装了验证码图片生成,和存储session功能。

代码如下:

package com.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

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

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
* @ClassName: CaptchaUtil
* @Description: 关于验证码的工具类
* @author 无名
* @date 2016-5-7 上午8:33:08
* @version 1.0
 */
public final class CaptchaUtil
{
    private CaptchaUtil(){}

    /*
     * 随机字符字典
     */
    private static final char[] CHARS = { ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘,
        ‘9‘, ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘, ‘H‘, ‘J‘, ‘K‘, ‘L‘, ‘M‘,
        ‘N‘, ‘P‘, ‘Q‘, ‘R‘, ‘S‘, ‘T‘, ‘U‘, ‘V‘, ‘W‘, ‘X‘, ‘Y‘, ‘Z‘ };

    /*
     * 随机数
     */
    private static Random random = new Random();

    /*
     * 获取6位随机数
     */
    private static String getRandomString()
    {
        StringBuffer buffer = new StringBuffer();
        for(int i = 0; i < 6; i++)
        {
            buffer.append(CHARS[random.nextInt(CHARS.length)]);
        }
        return buffer.toString();
    }

    /*
     * 获取随机数颜色
     */
    private static Color getRandomColor()
    {
        return new Color(random.nextInt(255),random.nextInt(255),
                random.nextInt(255));
    }

    /*
     * 返回某颜色的反色
     */
    private static Color getReverseColor(Color c)
    {
        return new Color(255 - c.getRed(), 255 - c.getGreen(),
                255 - c.getBlue());
    }

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

        response.setContentType("image/jpeg");

        String randomString = getRandomString();
        request.getSession(true).setAttribute("randomString", randomString);

        int width = 100;
        int height = 30;

        Color color = getRandomColor();
        Color reverse = getReverseColor(color);

        BufferedImage bi = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g = bi.createGraphics();
        g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));
        g.setColor(color);
        g.fillRect(0, 0, width, height);
        g.setColor(reverse);
        g.drawString(randomString, 18, 20);
        for (int i = 0, n = random.nextInt(100); i < n; i++)
        {
            g.drawRect(random.nextInt(width), random.nextInt(height), 1, 1);
        }

        // 转成JPEG格式
        ServletOutputStream out = response.getOutputStream();
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
        encoder.encode(bi);
        out.flush();
    }
}

前端获取验证码图片,要这样写:

……

<tr>
    <th>captcha</th>
    <td>
             <input type="text" id="captcha" name="captcha" class="text" maxlength="10" />
              <img id="captchaImage" src="captcha.form"/>
      </td>
</tr>

img的src里写入路径,页面加载时就会访问http://localhost:8888/RiXiang_blog/login/captcha.form获取图片。

表单的提交和登录信息验证就不具体讲了。

点击更换验证码的js代码如下:

                         // 更换验证码
                         $(‘#captchaImage‘).click(function()
                         {
                             $(‘#captchaImage‘).attr("src", "captcha.form?timestamp=" + (new Date()).valueOf());
                         }); 

可以看到后面加入时间戳作为参数,timestamp=" + (new Date()).valueOf()。加入这个参数就可以实现重新访问后台方法。否则是无法刷新图像的。

时间: 2024-08-29 04:49:39

springmvc下实现登录验证码功能的相关文章

64.django实现登录添加验证码功能

1.目的 现在我们一般访问网页都需要输入验证码,比如博客园,有的甚至是通过手机验证码实时登录.这样做的目的主要还是为了防止其他人的恶意访问,比如爬虫,下面就来看看验证码是如何实现的 2.演示 这里我在项目下创建了一个utils文件,存放验证码文件,字体文件下载猛戳这里 utils/code.py import random from PIL import Image,ImageDraw,ImageFont,ImageFilter def check_code(width=120, height=

C#WinForm 实现登录界面验证码功能(区分大小写+不区分大小写)

文章来自:https://blog.csdn.net/IT_xiao_guang_guang/article/details/104250015 一.功能界面 图1 验证码(区分大小写) 图2 验证码(不区分大小写) 二.创建一个产生验证码的类Class1 (1)生成随机验证码字符串,用的是Random随机函数 (2)创建验证码图片,将该字符串画在PictureBox控件中 Class1.cs: using System; using System.Collections.Generic; us

Android 登录注册功能

每个App都会登录注册功能,第一次做这个功能整整花了我一个星期的时间,中间最痛苦的地方莫过于实现cookie的自动管理,cookie中保留了用户登陆注册的个人信息.当时上网查了很多资料,也走了很多弯路,现在给大家分享出来.下面分两部分,一部分是注册功能的实现,一部分是登陆功能. 注册的功能一般流程为输入手机号,然后手机号会收到一个验证码,输入验证码之后会进入输入密码界面.两次密码输入正确之后注册流程就完成了. http = new HttpUtils(); httpClient = http.g

CAS添加验证码功能

1.  cas.war 下面的web-inf/web.xml  lib添加  kaptcha.jar kaptcha.jar通过maven获取 <dependency> <groupId>com.github.axet</groupId> <artifactId>kaptcha</artifactId> <version>0.0.9</version> </dependency> 这个maven 包含两个 ja

MVC基本登陆与验证码功能实现

一.基本登陆实现与验证码功能实现,该功能是和spring.net功能集合使用的,因为后面要用到验证是否处于登陆状态 1. 先构建一个登陆页面 1 @{ 2 Layout = null; 3 } 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <title>XX商城后台管理系统登录</title> 8 <script type="text/javascript"> 9 if (window

使用thinkphp3.2中的验证码功能

为了网站的安全性,使用验证码技术是比较常见的,今天按照thinkphp3.2完全开发手册的例子试了一下(地址http://document.thinkphp.cn/manual_3_2.html#verify),总是报错,没法显示验证码,原因原来是在PHP.INI文件中没有打开GD库. 只要将配置文件PHP.INI中的extension=php_gd2.dll注释去掉就可以了(php_gd2.dll   GD 库图像函数库 GD2). 生成验证码 public function code() {

HTTP协议下保证登录密码不被获取最健壮方式

说到在http协议下用户登录如何保证密码安全这个问题:    小白可能第一想法就是,用户在登录页面输入密码进行登录时,前台页面对用户输入的密码进行加密,然后把加密后的密码作为http请求参数通过网络发到服务器.    这样做是无法保证用户的账户安全的,因为稍微懂一点编程知识的人就可以通过你发送的http请求知道了你的密码,小白又说了,我密码加密了,它拿到的也是加密后的密码,它不知道我的原始密码它是无法从登录页面登录的. 新浪微博:intsmaze刘洋洋哥     但是小白啊,你有没有想过,有时候

Oracle 11g不同情形下的登录分析

对于Oracle初学者,甚至有些经验的Oracle DBA来说,Oracle的账户登录问题往往非常棘手,即便成功登录oracle也是知其然而不知其所以然.作者经过系统学习和反复实践,本着打破砂锅问到底的态度,总算对Oracle的登录原理与操作细节有了较全面的认识.本文记录下这些体会与经验,希望能帮助Oracle初学者自信地顺利登录oracle. 1 学习本文的先决条件 Oracle相关的知识很多,但一些基本的术语是所有dba都应该熟悉的.为更好的理解本文内容,读者需要理解如下术语: Instan

验证码功能

验证码功能 ① 在Public控制器中定义verify方法 ② 设置验证码相关参数 codeSet:显示的字符串 useZh:是否使用中文验证码 zhSet:显示的中文字符串 useImgBg:是否使用图片背景 fontSize:字体大小 useCurve:是否使用混淆线 useNoise:是否使用杂点 length:验证码采用多少个字符 fontttf:使用的字体样式 ③ 中文验证码 运行结果: 为什么会出现以上问题? 答:因为还没有提供任何中文字体,必须到系统字体目录中复制黑体常规到Thin