`
BestUpon
  • 浏览: 290595 次
  • 性别: Icon_minigender_1
  • 来自: 兰州
社区版块
存档分类
最新评论

使用jcaptcha 仿论坛tip 生成异步验证码

    博客分类:
  • J2EE
阅读更多

首先看看效果图:

 

如上图,点击验证码可以异步的刷新,借助了一个Jquery插件——jquery.qtip插件,和jcaptcha 配置生成验证码。

 

1.先配置好,能生成jcaptcha的环境,

在web.xml中添加如下内容:

<servlet>

		<servlet-name>jcaptcha2</servlet-name>
		<servlet-class>com.jxs.sys.core.global.jcaptcha.ImageCaptchaServlet</servlet-class>
		<load-on-startup>0</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>jcaptcha2</servlet-name>
		<url-pattern>/jcaptcha</url-pattern>
	</servlet-mapping>

 2.设置Servlet和regx,

 

package com.jxs.sys.core.global.jcaptcha;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

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

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.octo.captcha.service.CaptchaServiceException;
import com.octo.captcha.service.image.ImageCaptchaService;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

@SuppressWarnings("serial")
public class ImageCaptchaServlet extends HttpServlet {
	private ImageCaptchaService imageCaptchaService;
	private String beanName = "imageCaptchaService";

	public void init(ServletConfig servletConfig) throws ServletException {
		super.init(servletConfig);
		WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletConfig.getServletContext());
		imageCaptchaService = (ImageCaptchaService) wac.getBean(beanName, ImageCaptchaService.class);
	}

	protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {

		byte[] captchaChallengeAsJpeg = null;
		ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
		try {
			String captchaId = httpServletRequest.getSession().getId();
			BufferedImage challenge = imageCaptchaService.getImageChallengeForID(captchaId, httpServletRequest.getLocale());

			JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);
			jpegEncoder.encode(challenge);
		} catch (IllegalArgumentException e) {
			httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
			return;
		} catch (CaptchaServiceException e) {
			httpServletResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
			return;
		}

		captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

		httpServletResponse.setHeader("Cache-Control", "no-store");
		httpServletResponse.setHeader("Pragma", "no-cache");
		httpServletResponse.setDateHeader("Expires", 0);
		httpServletResponse.setContentType("image/jpeg");
		ServletOutputStream responseOutputStream = httpServletResponse.getOutputStream();
		responseOutputStream.write(captchaChallengeAsJpeg);
		responseOutputStream.flush();
		responseOutputStream.close();
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		super.doGet(req, resp);
	}

}
 

 

其他的代码,参见下载:jcaptcha_src.rar,

 

2.借助jquery去完成核心的代码。

首先设置logo.jsp

 

		<script type="text/javascript" src="js/jquery-1.3.2.js"></script>
		<script type="text/javascript" src="js/jquery.qtip-1.0.0-rc3.min.js"></script>
		<script type="text/javascript">
			var contextPath = '${pageContext.request.contextPath}';
		</script>
		<script type="text/javascript" src="js/jcaptcha.js"></script>
 

 

接下来就是要完成jcaptcha.js文件。

代码先给出,在解释:

 

var $j = jQuery.noConflict();
var realoadRandom = Math.random();
function refreshLoadRandom(obj, src){
    realoadRandom = Math.random();
    obj.src = src + "&amp;ran=" + realoadRandom;
}

$j(document).ready(function(){
    var i, styles, tooltipCount;
    tooltipCount = 0;
    styles = ['blue'];
    function createTooltip(){
        if (++tooltipCount == styles.length + 1) 
            return;
        this.elements.tooltip.qtip({
            content: '<img align=\"middle\" style=\"text-align: center; cursor: pointer;\" src=\"' + contextPath + '/jcaptcha\" onclick=\"this.src=\'' + contextPath + '/jcaptcha?now=' +
            realoadRandom +
            '\';refreshLoadRandom(this,\'' +
            contextPath +
            '/jcaptcha?nowa=nk\');\" alt=\"看不清,点击换一张\"/>',
            position: {
                corner: {
                    tooltip: 'leftMiddle',
                    target: 'rightMiddle'
                },
                adjust: {
                    resize: true,
                    scroll: true
                }
            },
            show: {
                ready: true
            },
            hide: false,
            style: {
                name: styles[tooltipCount - 1],
                width: 107,
                height: 30,
                size: {
                    x: 12,
                    y: 12
                },
                tip: true
            },
            api: {
                onRender: createTooltip
            }
        });
    }
    createTooltip.call({
        elements: {
            tooltip: $j('#j_captcha_response')
        }
    });
    $j('#j_username').qtip({
        position: {
            corner: {
                target: 'topMiddle',
                tooltip: 'bottomMiddle'
            }
        },
        content: "请在此输入您的用户名!",
        style: {
            name: 'blue',
            padding: '7px 13px',
            width: 250,
            tip: true
        }
    });
    $j('#j_password').qtip({
        position: {
            corner: {
                target: 'topMiddle',
                tooltip: 'bottomMiddle'
            }
        },
        content: "请在此输入您的密码!",
        style: {
            name: 'blue',
            padding: '7px 13px',
            width: 250,
            tip: true
        }
    });
    $j('#j_captcha_response').qtip({
        position: {
            corner: {
                target: 'topMiddle',
                tooltip: 'bottomMiddle'
            }
        },
        content: "请在此输入左边验证码!",
        style: {
            name: 'blue',
            padding: '7px 13px',
            width: 200,
            tip: true
        }
    });
    $j('#j_button_submit').qtip({
        position: {
            corner: {
                target: 'topMiddle',
                tooltip: 'bottomMiddle'
            }
        },
        content: "点击此处提交登录信息!",
        style: {
            name: 'blue',
            padding: '7px 13px',
            width: 250,
            tip: true
        }
    });
});

 

 这里有一个小小的技巧,那就是不让浏览器缓存验证码图片,var realoadRandom = Math.random();在外面设置了

这个变量,做随机变量。

 

function refreshLoadRandom(obj, src){

    realoadRandom = Math.random();

    obj.src = src + "&amp;ran=" + realoadRandom;

}

目的还是清楚缓存的辅助方法。

content: '<img align=\"middle\" style=\"text-align: center; cursor: pointer;\" src=\"' + contextPath + '/jcaptcha\" onclick=\"this.src=\'' + contextPath + '/jcaptcha?now=' +
            realoadRandom +
            '\';refreshLoadRandom(this,\'' +
            contextPath +
            '/jcaptcha?nowa=nk\');\" alt=\"看不清,点击换一张\"/>',
 

 

这个才是真正的生成验证码图片提示框的,src就是servlet地址,onclick是一部调用的关键,采用this.src重新赋值的

形式清楚浏览器的缓存,后面跟着一个无用的参数,名字随便起,之后realoadRandom是改变值了,要是不在此修改src的话,浏览器会缓存下来,所以要改变realoadRandom的,并且在此切换src的地址,保证不被缓存,点击的时候一次是

切换这两个地址,改变其src获取不同的图片。

 

  • 描述: 效果图
  • 大小: 100.6 KB
分享到:
评论
6 楼 ldsjdy 2011-09-24  
不错,刚好需要用到,参考一下
5 楼 binge520 2011-05-11  
能不能简单点 挺麻烦的
4 楼 TESZLX 2010-11-02  
BestUpon 写道
笑我痴狂 写道
nighthawk 写道
我说啊,就一个验证码怎么搞的这么复杂


同意


各有所见:正所谓,同样是饼子,为什么还会有烧饼,不就是饼子么?调味品不一样而已。

3 楼 BestUpon 2010-09-13  
笑我痴狂 写道
nighthawk 写道
我说啊,就一个验证码怎么搞的这么复杂


同意


各有所见:正所谓,同样是饼子,为什么还会有烧饼,不就是饼子么?调味品不一样而已。
2 楼 笑我痴狂 2010-09-13  
nighthawk 写道
我说啊,就一个验证码怎么搞的这么复杂


同意
1 楼 nighthawk 2010-08-18  
我说啊,就一个验证码怎么搞的这么复杂

相关推荐

    Jquery Tip 插件使用

    **jQuery Tip 插件使用详解** 在Web开发中,提示框(Tip)是常见的交互元素,用于向用户提供信息、警告或指示。jQuery Tip插件是一款轻量级且易于使用的工具,能够帮助开发者快速实现各种提示功能。本文将详细介绍...

    TIP42c三极管参数及引脚图

    在音频功率放大器中,TIP42c和TIP41的搭配使用可以提供较大的输出功率和较好的线性度。 除了上述参数之外,TIP42c三极管还具有一些其他的电气特性,如集电极-发射极击穿电压、集电极最大直流电流、集电极最大功耗等...

    TIPTOP與其他系統之WebService接口資料

    1. 开发工具:开发者可以使用诸如Apache Axis、wsimport(Java)、Visual Studio(.NET)等工具自动生成客户端代码,简化调用Web Service的过程。 2. 测试:接口开发完成后,需进行单元测试和集成测试,确保服务能...

    Tip类demo Tip类demo

    在Android开发中,"Tip类demo"通常指的是创建和使用提示信息类的示例。Tip类是用来显示一些临时性或辅助性的信息,如警告、提示、帮助等,它可以帮助用户更好地理解和操作应用。这里我们将详细探讨如何在Android中...

    Tiptop T100 Tiptop GP鼎捷智能物流平台 鼎捷APP 二维码整体解决方案 鼎捷WMS仓库移动扫码鼎捷安卓PDA

    最近定制开发了一套适合企业的条码扫码平台,支持鼎捷Tiptop T100、Tiptop GP平台二次开发,已经在五六家企业磨炼成品,欢迎咨询交流。具有以下功能: 1)根据原来企业规则生成二维码 2)通过PDA扫描条码完成出...

    TIPTOP对接通达OA工作流

    TIPTOP对接通达OA工作流是一个旨在整合两个不同系统——TIPTOP和通达OA(Kingdee Office Automation)——的程序,目的是实现工作流的无缝交互。在企业信息化管理中,工作流自动化是一个关键部分,它能提高效率,...

    MFC控件添加tip提示

    使用Visual Studio(如VS2017或VS2008)新建项目,选择"MFC AppWizard",然后按照向导的提示配置你的应用程序。 2. **添加控件** 在资源视图中,你可以添加所需的控件,例如按钮(CButton)、复选框(CButton,...

    Tip.rar_delphi 消息提示_tip

    5. **异步通知**:如果希望在程序运行时的某个特定时刻显示提示,可以使用异步方法,如在一个单独的线程中处理消息提示,避免阻塞主线程。 6. **事件响应**:确保正确处理用户对消息提示的响应,例如点击按钮后的...

    TOPGP生成二维码(支持DM码).rar

    在TIPTOPGP中实现DM码打印,打包文件中有详细步骤,手把手教你怎么配置。粘贴实现代码,清晰了然。支持jdk1.6的zxing包(下载以后4gl里面游标改一下别名)

    tiptop知识文件

    9. **进阶学习资源**:推荐进一步学习"tiptop"的书籍、网站、论坛或者社区,鼓励用户持续学习和探索。 为了全面了解"tiptop",我们需要解压文件并逐一研究,以获取每个部分的详细信息。同时,如果有相关的文档或...

    TIPTOP GP操作手册

    此套操作手册详细介绍了GP5.X版本的各项功能与操作流程,帮助用户更好地理解和使用该系统。 首先,"流通零售系统.pdf"涵盖了关于零售业的运营流程和管理功能。这个模块可能包括库存管理、POS(销售点)系统操作、...

    D3 Tip 获取 X,Y

    D3 Tip的使用主要涉及以下几个关键步骤: 1. **引入资源**:首先,你需要在HTML文件中引入D3.js和D3 Tip的库。D3.js通常是通过CDN链接或者本地文件引入,而D3 Tip可以通过npm安装后本地引用,或者直接在页面中使用...

    鼎捷易拓TIPTOP开发视频详细讲解.zip

    《鼎捷易拓TIPTOP开发视频详细讲解》是一份专为鼎捷易拓TIPTOP GP/T100系统运维者设计的教育资源。该压缩包包含了一系列的视频教程,旨在帮助用户深入理解和掌握该系统的开发与维护技能。 1. **水晶报表(Crystal ...

    jquery.tip 点击加分效果,漂亮的tip

    为了使用jQuery.tip插件,你需要在项目中引入jQuery库和插件的JavaScript及CSS文件。然后,通过简单的jQuery选择器和方法调用来绑定元素并设置提示信息。例如: ```javascript $(document).ready(function() { $('...

    tiptop中如何使用TextEdit来显示html网页

    在tiptop系统中使用TextEdit来显示HTML网页涉及一系列的步骤和组件。首先,需要了解tiptop是什么,它是一种在多种操作系统上运行的集成开发环境和事务处理系统,尤其在一些旧式商业应用中较为常见。接着,我们来详细...

    TIPTOP GP 官方教育培训手册打包.rar

    5. **报表与分析**:介绍如何利用TIPTOP GP生成各种业务报表,进行数据分析,支持决策制定。 6. **安全与权限管理**:讨论如何设置用户角色、权限控制,确保数据的安全性和访问控制。 7. **集成与API**:如果TIP...

    div+tip(title)

    在网页设计和开发中,`div` 和 `tip` 是两个非常重要的概念,尤其是在构建用户界面时。`div` 是HTML中的一个通用容器元素,全称为 "division",用于组合HTML文档中的其他元素,以便更好地组织和布局内容。而 `tip` ...

    前端项目-d3-tip.zip

    在添加图形元素时,使用`tip.show`和`tip.hide`方法来控制提示框的显示和隐藏。例如,当鼠标进入元素范围时显示提示,离开时隐藏提示: ```javascript svg.selectAll("circle") .data(data) .enter().append(...

    Optimal Tip-To-Tip Efficiency(弟高值d2f算法).pdf

    Optimal Tip-To-Tip Efficiency(弟高值d2f算法).pdf Optimal Tip-To-Tip Efficiency(弟高值d2f算法).pdf Optimal Tip-To-Tip Efficiency(弟高值d2f算法).pdf Optimal Tip-To-Tip Efficiency(弟高值d2f算法).pdf ...

    tip122 pdf资料

    ### TIP122与TIP120/TIP121:大功率达林顿晶体管解析 #### 概述 TIP120、TIP121和TIP122是一系列高性能的大功率达林顿NPN型晶体管,封装于Jedec TO-220塑料封装中,广泛应用于功率线性和开关应用中。它们是单片...

Global site tag (gtag.js) - Google Analytics