`

Captcha验证码+刷新问题

    博客分类:
  • Seam
阅读更多
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package com.htl.other;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.captcha.Captcha;
import org.jboss.seam.captcha.CaptchaResponse;

import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;

@Name("org.jboss.seam.captcha.captcha")
@Scope(ScopeType.SESSION)
@Install(precedence = Install.APPLICATION)
public class Coder extends Captcha {

    /**
*
*/
private static final long serialVersionUID = 4353904503753742537L;

private Color backgroundColor = new Color(0xf5,0xf5, 0xf5);
private Font textFont = new Font("verdana", Font.PLAIN, 30);
private int charsToPrint = 4;
private int width = 100;
private int height = 30;
private int circlesToDraw = 4;
private float horizMargin = 10.0f;
private double rotationRange = 0.2;
private String elegibleChars = "123456789";
private char[] chars = elegibleChars.toCharArray();

    @Override
    @Create
    public void init() {
        super.init();
        StringBuffer finalString = new StringBuffer();
        for (int i = 0; i < charsToPrint; i++) {
            double randomValue = Math.random();
            int randomIndex = (int) Math.round(randomValue * (chars.length - 1));
            char characterToShow = chars[randomIndex];
            finalString.append(characterToShow);
        }
        setChallenge(finalString.toString());
        setCorrectResponse(finalString.toString());
    }

    @Override
    public BufferedImage renderChallenge() {
        // Background
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = (Graphics2D) bufferedImage.getGraphics();
        g.setColor(backgroundColor);
        g.fillRect(0, 0, width, height);

        // Some obfuscation circles
        for (int i = 0; i < circlesToDraw; i++) {
            int circleColor = 80 + (int)(Math.random() * 70);
            float circleLinewidth = 0.3f + (float)(Math.random());
            g.setColor(new Color(circleColor, circleColor, circleColor));
            g.setStroke(new BasicStroke(circleLinewidth));
            int circleRadius = (int) (Math.random() * height / 2.0);
            int circleX = (int) (Math.random() * width - circleRadius);
            int circleY = (int) (Math.random() * height - circleRadius);
            g.drawOval(circleX, circleY, circleRadius * 2, circleRadius * 2);
        }

        // Text
        g.setFont(textFont);
        FontMetrics fontMetrics = g.getFontMetrics();
        int maxAdvance = fontMetrics.getMaxAdvance();
        int fontHeight = fontMetrics.getHeight();
        float spaceForLetters = -horizMargin * 2 + width;
        float spacePerChar = spaceForLetters / (charsToPrint - 1.0f);

        char[] allChars = getChallenge().toCharArray();
        for (int i = 0; i < allChars.length; i++ ) {
            char charToPrint = allChars[i];
            int charWidth = fontMetrics.charWidth(charToPrint);
            int charDim = Math.max(maxAdvance, fontHeight);
            int halfCharDim = (charDim / 2);
            BufferedImage charImage = new BufferedImage(charDim, charDim, BufferedImage.TYPE_INT_ARGB);
            Graphics2D charGraphics = charImage.createGraphics();
            charGraphics.translate(halfCharDim, halfCharDim);
            double angle = (Math.random() - 0.5) * rotationRange;
            charGraphics.transform(AffineTransform.getRotateInstance(angle));
            charGraphics.translate(-halfCharDim, -halfCharDim);
            int charColor = 60 + (int)(Math.random() * 90);
            charGraphics.setColor(new Color(charColor, charColor, charColor));
            charGraphics.setFont(textFont);
            int charX = (int) (0.5 * charDim - 0.5 * charWidth);
            charGraphics.drawString("" + charToPrint, charX, ((charDim - fontMetrics.getAscent())/2 + fontMetrics.getAscent()));
            float x = horizMargin + spacePerChar * (i) - charDim / 2.0f;
            int y = ((height - charDim) / 2);
            g.drawImage(charImage, (int) x, y, charDim, charDim, null, null);
            charGraphics.dispose();
        }
        g.dispose();
        return bufferedImage;
    }

    @CaptchaResponse(message = "校验码错误,请重新输入!")
    public String getResponse() {
        return super.getResponse();
    }

}


想刷新页面需要在Page的页面中加入
<action execute="#{captcha.init()}"/>
分享到:
评论

相关推荐

    Zend_captcha_image点击刷新图片验证码(dojo_ajax)

    总结起来,"Zend_captcha_image点击刷新图片验证码(dojo_ajax)"涉及到的技术包括PHP的Zend Framework用于创建和管理验证码,利用Dojo进行前端交互,以及Ajax实现无刷新的图像刷新和验证。这种组合提供了高效且安全的...

    jsp验证码刷新功能

    ### jsp验证码刷新功能 在Web开发中,验证码(CAPTCHA)被广泛应用于表单提交、用户登录等场景,以防止自动化的恶意攻击或垃圾信息的提交。而在JSP技术中实现验证码的刷新功能,不仅可以提升用户体验,还能进一步...

    Jsp-图片验证码及刷新

    在网页应用中,图片验证码(CAPTCHA)是一种广泛使用的安全机制,用于防止自动化的机器人或恶意软件进行非法操作,如批量注册、恶意登录等。它要求用户输入显示在图片中的随机字符,以此来验证用户是人而不是计算机...

    tp5(thinkPHP5框架)captcha验证码配置及验证操作示例

    以下将详细介绍如何在tp5中配置和使用captcha验证码。 ### 1. 安装captcha扩展 首先,你需要通过Composer来安装ThinkPHP5的captcha扩展。打开终端,进入你的项目目录,然后运行以下命令: ```bash composer ...

    JAVA实现注册页面验证码刷新

    "JAVA实现注册页面验证码刷新"的课题旨在探讨如何在Java后端生成并更新前端显示的验证码,确保每次用户请求时都能显示新的、随机生成的验证码。下面将详细介绍这个过程涉及的关键知识点。 1. **验证码的生成**: -...

    servlet生成随机验证码

    在Web开发中,验证码是一种常见的安全机制,用于防止自动化脚本或机器人进行恶意操作,如批量注册、频繁登录等...在实际应用中,你可能还需要考虑验证码的有效期、刷新机制、以及更复杂的抗机器学习算法来提高安全性。

    Ajax异步无刷新验证码

    Ajax异步无刷新验证码解决了这个问题,当用户输入错误的验证码后,只需点击刷新按钮或触发特定事件,即可在不刷新整个页面的情况下更新验证码。 Ajax是Web开发中的一种技术,它允许浏览器与服务器进行后台通信,...

    html5点击刷新验证码特效

    总的来说,HTML5在实现点击刷新验证码特效中扮演了重要角色,结合其强大的图形绘制能力、事件处理机制、离线存储以及现代化的网络请求API,可以创建出高效、响应式的验证码刷新功能,提高网页的交互体验。

    使用js来刷新验证码

    通过这种方式,用户每次点击刷新按钮,都会向服务器请求新的验证码图像,确保每次显示的验证码都是唯一的,增强了网站的安全性。同时,由于刷新过程在客户端完成,减少了服务器的负担。 这就是如何结合PHP和...

    php验证码与刷新

    验证码(CAPTCHA)是一种用于验证用户是否为人类的技术,它常用于防止自动化程序(如机器人)进行恶意操作,如批量注册、垃圾评论等。在PHP中实现验证码功能,可以有效地提高网站的安全性。本篇文章将深入探讨PHP...

    java通过JCaptcha生成验证码

    5. **生成验证码**:调用 `DefaultCaptchaService` 的 `getImage Captcha()` 方法可以生成包含验证码图像和文本的 `Captcha` 对象。这个对象包含了验证码图像和对应的文本,通常需要将图像显示在网页上,而文本保存...

    只更新验证码,不刷新页面

    传统的验证码机制往往需要用户在输入表单时手动刷新验证码图片以获取新的验证码。然而,这种做法可能导致用户在填写表单的过程中被打断,降低了用户体验。通过使用`&lt;iframe&gt;`,我们可以实现验证码的动态更新,让用户...

    可刷新的c#验证码源代码

    验证码(CAPTCHA)是“全自动区分计算机和人类的图灵测试”(Completely Automated Public Turing test to tell Computers and Humans Apart)的缩写。它的主要目的是区分用户是真实的、有意识的人类还是无意识的...

    最全最完整的网站 ASP 验证码 CAPTCHA 源代码

    asp验证码-带刷新-最简洁的验证码代码.rar ASP验证非常优秀的ASP随机验证码.rar Classic-ASP-and-Google-Captcha-main.zip Classic-ASP-and-Google-reCAPTCHA-master.zip classic-asp-captcha-master.zip

    基于ASP的迅易无组件ASP中文图形验证码 带刷新图形功能修正版.zip

    2. `refresh.asp`:刷新验证码图像的页面,可能包含重定向到`captcha.asp`的逻辑。 3. `styles.css`:可能用于定义验证码图像和相关元素的样式。 4. `example.html`或`test.asp`:示例页面,展示如何在实际网页中...

    asp.net ajax实现无刷新验证码

    在现代Web开发中,验证码(CAPTCHA)作为用户身份验证的一种手段,被广泛应用于登录界面、表单提交等场景中,用以区分人类用户与自动化程序。传统的验证码加载方式往往伴随着页面的刷新,这不仅影响用户体验,也增加...

    SpringMVC生成的验证码图片不显示问题及解决方法

    问题的原因可能是由于浏览器的缓存机制,导致验证码图片不被刷新。解决方法是设置浏览器不要缓存该图片,使用response.setHeader()方法设置Pragma、Cache-Control和Expires头信息。 知识点4: 404错误的解决方法 在...

    验证码动态实现验证码刷新

    在实际编程中,我们可能会创建一个专门的`captcha`服务,这个服务会接收请求,然后根据上述步骤生成并返回验证码。`tag验证码代码!`标签暗示了这可能是一个代码示例,可能包含用于生成验证码的类或者函数,以及处理...

    .net+js实现的可刷新的验证码

    `.NET` 和 `JavaScript` 结合实现的可刷新验证码技术,能够提供用户友好的交互体验,同时保持系统安全。本文将深入探讨这种技术的原理、实现方法以及其在实际应用中的价值。 首先,验证码的核心在于生成一串随机且...

Global site tag (gtag.js) - Google Analytics