kaptcha验证码组件

1、什么是验证码?


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


作用


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


分类


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


2


kaptcha验证码组件


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;

        }

}

总结

猜你喜欢

转载自blog.csdn.net/u012129031/article/details/78717153