jcaptcha使用

jcaptcha使用

jcaptcha是做图片验证码的,主要说下在springboot 里面的使用方法.

pom.xml里面的配置

xml

<dependency>

<groupId>com.octo.captcha</groupId>

<artifactId>jcaptcha</artifactId>

<version>1.0</version>

</dependency>

 

两个java类

CaptchaService 处理图片

import com.octo.captcha.component.image.backgroundgenerator.GradientBackgroundGenerator;
import com.octo.captcha.component.image.color.SingleColorGenerator;
import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
import com.octo.captcha.component.image.textpaster.NonLinearTextPaster;
import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;
import com.octo.captcha.engine.GenericCaptchaEngine;
import com.octo.captcha.image.gimpy.GimpyFactory;
import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;

import java.awt.*;


public class CaptchaService {
    private static class SingletonHolder {
        private static ImageCaptchaService imageCaptchaService = new DefaultManageableImageCaptchaService(
                new FastHashMapCaptchaStore(),
                new GenericCaptchaEngine(
                        new GimpyFactory[]{new GimpyFactory(
                                new RandomWordGenerator("123456789ABCE"),
                                new ComposedWordToImage(
                                        new RandomFontGenerator(20, 20, new Font[]{new Font("Arial", 20, 20)}),
                                        new GradientBackgroundGenerator(90, 30, new SingleColorGenerator(new Color(235, 255, 255)), new SingleColorGenerator(new Color(255, 195, 230))),
                                        new NonLinearTextPaster(4, 4, new Color(11, 11, 11))
                                )
                        )}
                ),
                180,
                180000,
                20000
        );
    }

    private CaptchaService() {
    }

    public static ImageCaptchaService getInstance() {
        return SingletonHolder.imageCaptchaService;
  }
}

CaptchaController 处理页面请求

import com.octo.captcha.service.CaptchaServiceException;
import com.smspai.sms.website.config.CaptchaService;
import org.apache.ibatis.annotations.Param;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;


@Controller
@RequestMapping("/component")
public class CaptchaController {
	// slf4j logger
	private final static Logger logger = LoggerFactory.getLogger(CaptchaController.class);

	@ResponseBody
	@RequestMapping(value = "/captcha") //captcha captchaImage
	public void getJCaptchaImage(HttpServletRequest request, HttpServletResponse response) throws Exception {
		response.setDateHeader("Expires", 0);
		response.setHeader("Cache-Control", "no-cache, must-revalidate");
		response.addHeader("Cache-Control", "post-check=0, pre-check=0");
		response.setHeader("Pragma", "no-cache");
		response.setContentType("image/jpeg");
		BufferedImage bi = CaptchaService.getInstance().getImageChallengeForID(request.getSession(true)
				.getId());
		ServletOutputStream out = response.getOutputStream();
		ImageIO.write(bi, "jpg", out);
		try {
			out.flush();
		} finally {
			out.close();
		}
		return;
	}

	//    经验:@Param("code") String code 这两个名字必须相同,都要叫code,这是绑定的
	@ResponseBody
	@RequestMapping(value = "/check", method = RequestMethod.POST) // check validate
	@ResponseStatus(HttpStatus.OK)
	public Object validate(@Param("code") String code, HttpServletRequest request) {
		ModelMap modelMap = new ModelMap();
		boolean isCaptchaCorrect = false;
		try {
			isCaptchaCorrect = CaptchaService.getInstance().validateResponseForID(request.getSession().getId(), code.toUpperCase());
//        if (isCaptchaCorrect) {
//
//        }
		} catch (CaptchaServiceException exception) {
			logger.debug(">>>>>>>[CaptchaController.validate]:\n "  + exception.getMessage());
			modelMap.addAttribute("refresh", true);
		}
		modelMap.addAttribute("success", isCaptchaCorrect);

		logger.debug(">>>>>>>[CaptchaController.validate]: \n" + code + ":" + isCaptchaCorrect);

		return modelMap;
	}
}

页面设置 及 js

<div class="field-container">
	<input  name="checkcode" type="text"  data-placeholder="验证码" placeholder="验证码"/>
	<img style="float:left;cursor: pointer;border: 1px solid #ddd;margin-left: 10px;" src="/component/captcha" id="J_captcha" title="点击刷新验证码" border="0" height="30"/>
</div>

检查验证码

$(".field[name=checkcode]").keyup(function (event) {

	var _this = $(this);
	var val = $.trim(_this.val());
	if (val.length == 4) {
		$.ajax({
			type: 'POST',
			dataType: 'json',
			url: '/component/check',
			data: {
				code: val
			},
			success: function (result) {
				if (result.success) {

					$(".ccstatus").show();
				} else if (result.refresh) {
					$("#J_captcha").click();
				} else {
					$(".ccstatus").hide();
				}
			},
			error: function () {
				$(".ccstatus").hide();
			}

		});

	} else {
		$(".ccstatus").hide();
	}

});

验证码刷新

$("#J_captcha").click(function () {
	var _this = $(this);
	var ts = new Date().getTime();
	_this.attr('src', '/component/captcha?ts=' + ts);
	$(".field[name=checkcode]").val('');
	$(".field[name=checkcode]").focus();
});
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100412.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Flink SQL Client初探

    Flink SQL Client初探

    2020年11月19日
    209
  • Kong网关upstream健康检查机制[通俗易懂]

    Kong网关upstream健康检查机制[通俗易懂]upstream概念及作用upstream是指位于Kong网关之后的上游API/service,即客户端请求被Kong网关转发到的目标地址。在Kong网关中,upstream表示虚拟主机名,可用于:健康检查 熔断 负载均衡。在实际生产环境中,upstream可以指向部署在不同ip和端口的服务(target),在Kong网关的service中代替具体的单个target的配置,结构图如下:负载均衡器以轮询等方式对upstream中配置的target进行负载,并对target进行健康检查,K

    2022年9月10日
    1
  • jiaowubuaa_acm题

    jiaowubuaa_acm题每一头牛的愿望就是变成一头最受欢迎的牛。现在有 N 头牛,编号从 1 到 N,给你 M 对整数 (A,B),表示牛 A 认为牛 B 受欢迎。这种关系是具有传递性的,如果 A 认为 B 受欢迎,B 认为 C 受欢迎,那么牛 A 也认为牛 C 受欢迎。你的任务是求出有多少头牛被除自己之外的所有牛认为是受欢迎的。输入格式第一行两个数 N,M;接下来 M 行,每行两个数 A,B,意思是 A 认为 B 是受欢迎的(给出的信息有可能重复,即有可能出现多个 A,B)。输出格式输出被除自己之外的所有牛认为是

    2022年8月9日
    3
  • Android浏览器的插件渲染模式简介

    Android浏览器的插件渲染模式简介简单介绍了Android浏览器的插件渲染模式(bitmap模式和surface模式)

    2022年5月14日
    42
  • 绘图杂记【1】Python、R等绘图

    绘图杂记【1】Python、R等绘图离散分布水平条形图Discretedistributionashorizontalbarchartimportnumpyasnpimportmatplotlib.pyplotaspltcategory_names=[‘Stronglydisagree’,’Disagree’,’Neitheragreenordisagree’,’Agree’,’Stronglyagree’]results={‘Que

    2022年5月3日
    35
  • 按位取反运算符~_c语言∧按位异或运算符

    按位取反运算符~_c语言∧按位异或运算符https://www.cnblogs.com/shy1766IT/p/6184874.html二进制数在内存中以补码的形式存储。按位取反:二进制每一位取反,0变1,1变0。~9的计算步骤:转二进制:01001计算补码:01001按位取反:10110转为原码:按位取反:11001末位加一:11010符号位为1是负数,即-10varx…

    2022年8月14日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号