【服务器开发系列】图形验证码到底是怎么回事?

简介: 阅读本文大概需要10分钟。

1什么是验证码?


验证码是一种区分用户是计算机还是人的公共全自动程序。短时间是无法退出人类舞台的,目前只是尽量提升用户体验


作用


  • 账号安全
  • 反作弊
  • 反爬虫
  • 防论坛灌水
  • 防恶意注册


分类


  • 图形验证码
  • Gif动画验证码
  • 手机短信验证码
  • 手机语音验证码
  • 视频验证码
  • web2.0验证码


2kaptcha验证码组件


kaptcha 是一个非常实用的验证码生成工具;有了它,你可以生成各种样式的验证码,因为它是可配置的


常见配置


  1. 验证码的字体
  2. 验证码字体的大小
  3. 验证码字体的字体颜色
  4. 验证码内容的范围(数字,字母,中文汉字)
  5. 验证码图片的大小,边框,边框粗细,边框颜色
  6. 验证码的干扰线(可以自己继承com.google.code.kaptcha.NoiseProducer写一个自定义的干扰线)
  7. 验证码的样式(鱼眼样式、3D、普通模糊……当然也可以继承com.google.code.kaptcha.GimpyEngine自定义样式)


引入maven配置



<dependency>
    <groupId>com.github.axet</groupId>
    <artifactId>kaptcha</artifactId>
    <version>0.0.9</version>
</dependency>



  kaptcha.properties


kaptcha.textproducer.font.color=red
kaptcha.image.width=130
kaptcha.image.height=44
kaptcha.textproducer.font.size=35
kaptcha.textproducer.char.length=4
kaptcha.textproducer.font.names=\\u5B8B\\u4F53,\\u6977\\u4F53,\\u5FAE\\u8F6F\\u96C5\\u9ED1
kaptcha.noise.color=gray
kaptcha.obscurificator.impl=com.google.code.kaptcha.impl.WaterRipple


用filter过滤器来生成验证码,具体步骤如下:


1、web.xml


<filter>
    <filter-name>KaptchaFilter</filter-name>
    <filter-class>com.xxoo.admin.ui.filter.KaptchaFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>KaptchaFilter</filter-name>
    <url-pattern>/kaptcha.jpg</url-pattern>
</filter-mapping>


说明:验证码过滤器需要放到Shiro之后,因为Shiro将包装HttpSession.如果不,可能造成两次的sesisonid不一样。


2、图片验证码类


public class CaptchaService {
    private static ImageCaptchaService instance = null;
    static {
        instance = new KaptchaImageCaptchaService();
    }
    public synchronized static ImageCaptchaService getInstance() {
        return instance;
    }
    public synchronized static boolean validate(HttpServletRequest httpServletRequest, String input) throws Exception {
        String text = instance.getText(httpServletRequest);
        boolean result = text.equalsIgnoreCase(input);
        instance.removeKaptcha(httpServletRequest);
        return result;
    }
}


3、基于Kaptcha的验证码图片实现


public class KaptchaImageCaptchaService implements ImageCaptchaService {
    private Logger logger = LoggerFactory.getLogger(getClass());
    public KaptchaImageCaptchaService() {
    }
    public static Config getConfig() throws IOException {
        Properties p = new Properties();
        p.load(new DefaultResourceLoader().getResource("kaptcha.properties").getInputStream());
        Config config = new Config(p);
        return config;
    }
    @Override
    public void create(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        httpServletResponse.setDateHeader("Expires", 0L);
        httpServletResponse.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        httpServletResponse.addHeader("Cache-Control", "post-check=0, pre-check=0");
        httpServletResponse.setHeader("Pragma", "no-cache");
        httpServletResponse.setContentType("image/jpeg");
        Config config = getConfig();
        Producer producer = config.getProducerImpl();
        String capText = producer.createText();
        if(logger.isDebugEnabled()){
            logger.info("create captcha:" + capText + ":" + config.getSessionKey() );
        }
        httpServletRequest.getSession().setAttribute(config.getSessionKey(), capText);
        httpServletRequest.getSession().setAttribute(config.getSessionDate(), new Date());
        BufferedImage bi = producer.createImage(capText);
        ServletOutputStream out = httpServletResponse.getOutputStream();
        ImageIO.write(bi, "jpg", out);
        out.flush();
        out.close();
    }
    @Override
    public String getText(HttpServletRequest httpServletRequest) throws Exception {
        return (String)httpServletRequest.getSession().getAttribute(getConfig().getSessionKey());
    }
    @Override
    public void removeKaptcha(HttpServletRequest httpServletRequest) throws Exception {
        httpServletRequest.getSession().removeAttribute(getConfig().getSessionKey());
        httpServletRequest.getSession().removeAttribute(getConfig().getSessionDate());
    }
}


4、验证码工具类


public class CaptchaService {
    private static ImageCaptchaService instance = null;
    static {
        instance = new KaptchaImageCaptchaService();
    }
    public synchronized static ImageCaptchaService getInstance() {
        return instance;
    }
    public synchronized static boolean validate(HttpServletRequest httpServletRequest, String input) throws Exception {
        String text = instance.getText(httpServletRequest);
        boolean result = text.equalsIgnoreCase(input);
        instance.removeKaptcha(httpServletRequest);
        return result;
    }
}


5、生成验证码过滤器


public class KaptchaFilter extends OncePerRequestFilter {
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
        try {
            CaptchaService.getInstance().create(httpServletRequest,httpServletResponse);
        } catch (Exception e) {
            logger.info("create captcha error.",e);
        }
    }
}


6、验证码校验


private boolean doCaptchaValidate(HttpServletRequest request, String code) {
        //比对
        try {
            if (code == null || !CaptchaService.validate(request, code)) {
                return false;
            } else {
                return true;
            }
        } catch (Exception e) {
            logger.warn("captcha check error!");
            return false;
        }
}


总结


本文主要讲述了kaptcha图形化验证码的使用和介绍,小伙伴可以根据自己的需求进行引入。

相关文章
|
10天前
|
弹性计算 数据挖掘 应用服务中间件
阿里云轻量应用服务器68元与云服务器99元和199元区别及选择参考
目前阿里云有三款特惠云服务器,第一款轻量云服务器2核2G68元一年,第二款经济型云服务器2核2G3M带宽99元1年,第三款通用算力型2核4G5M带宽199元一年。有的新手用户并不是很清楚他们之间的区别,因此不知道如何选择。本文来介绍一下它们之间的区别以及选择参考。
229 87
|
3天前
|
存储 弹性计算 应用服务中间件
阿里云轻量应用服务器出新品通用型实例了,全球26个地域可选
近日,阿里云再度发力,推出了首款全新升级的轻量应用服务器——通用型实例。这款服务器实例不仅标配了200Mbps峰值公网带宽,更在计算、存储、网络等基础资源上进行了全面优化,旨在为中小企业和开发者提供更加轻量、易用、普惠的云计算服务,满足其对于通用计算小算力的迫切需求。目前,这款新品已在全球26个地域正式上线,为全球用户提供了更加便捷、高效的上云选择。
|
20天前
|
机器学习/深度学习 人工智能 PyTorch
阿里云GPU云服务器怎么样?产品优势、应用场景介绍与最新活动价格参考
阿里云GPU云服务器怎么样?阿里云GPU结合了GPU计算力与CPU计算力,主要应用于于深度学习、科学计算、图形可视化、视频处理多种应用场景,本文为您详细介绍阿里云GPU云服务器产品优势、应用场景以及最新活动价格。
阿里云GPU云服务器怎么样?产品优势、应用场景介绍与最新活动价格参考
|
19天前
|
存储 运维 安全
阿里云弹性裸金属服务器是什么?产品规格及适用场景介绍
阿里云服务器ECS包括众多产品,其中弹性裸金属服务器(ECS Bare Metal Server)是一种可弹性伸缩的高性能计算服务,计算性能与传统物理机无差别,具有安全物理隔离的特点。分钟级的交付周期将提供给您实时的业务响应能力,助力您的核心业务飞速成长。本文为大家详细介绍弹性裸金属服务器的特点、优势以及与云服务器的对比等内容。
|
11天前
|
存储 人工智能 网络协议
浅聊阿里云倚天云服务器:c8y、g8y、r8y实例性能详解与活动价格参考
选择一款高性能、高性价比的云服务器对于企业而言至关重要,阿里云推出的倚天云服务器——c8y、g8y、r8y三款实例,它们基于ARM架构,采用阿里自研的倚天710处理器,并基于新一代CIPU架构,通过芯片快速路径加速手段,实现了计算、存储、网络性能的大幅提升。2025年,计算型c8y云服务器活动价格860.65元一年起,通用型g8y云服务器活动价格1187.40元一年起,内存型r8y云服务器活动价格1454.32元一年起。本文将为大家详细解析这三款实例的性能特点、应用场景以及最新的活动价格情况,帮助大家更好地了解阿里云倚天云服务器。
|
26天前
|
人工智能 JSON Linux
利用阿里云GPU加速服务器实现pdf转换为markdown格式
随着AI模型的发展,GPU需求日益增长,尤其是个人学习和研究。直接购置硬件成本高且更新快,建议选择阿里云等提供的GPU加速型服务器。
利用阿里云GPU加速服务器实现pdf转换为markdown格式
|
4天前
|
人工智能 安全 Linux
阿里云与龙蜥携手打造智算时代最佳服务器操作系统
本次分享的主题是阿里云与龙蜥携手打造智算时代最佳服务器操作系统,由阿里云技术软件部产品总监张鹏程分享。主要分为三个部分: 1.开源社区 2.操作系统 3.云 + AI
阿里云与龙蜥携手打造智算时代最佳服务器操作系统
|
14天前
|
机器学习/深度学习 弹性计算 缓存
简单聊聊,阿里云2核2G3M带宽云服务器与轻量应用服务器区别及选择参考
2核2G3M带宽云服务器与轻量应用服务器是目前阿里云的活动中,入门级走量型云服务器,轻量云服务器2核2G3M带宽68元一年,经济型e实例云服务器2核2G3M带宽99元1年。同样的配置,对于有的新手用户来说,有必要了解一下他们之间的区别,以及各自的购买和续费相关政策,从而选择更适合自己需求的云服务器。本文为大家简单分析一下我们应该选择哪一款。
|
14天前
|
监控 安全 数据库
阿里云国际站:如何使用阿里云国际站服务器
阿里云国际站服务器是一种强大的云计算服务,可以帮助用户轻松搭建和管理自己的网站、应用程序和数据库。本文将介绍如何使用阿里云国际站服务器,包括注册账户、选择服务器配置、安装操作系统、配置网络和安全设置等方面。

热门文章

最新文章