New composite based captcha image

recaptcha的验证码新增了alpha composite的新机制取代干扰线,今天用了一些时间在YAN上也实现了这种绘图机制。

30a2512d899641a8ab79a7c86946ff71
f03ec596b91b4ce985c5b5af4a79e961

使用Java2D的AlphaComposite实现,选用的Rule为alpha 1.0的SrcOut,即通过公式

Ar = As * (1 – Ad )
Cr = Cs * (1 – Ad )
用语言描述就是叠加区域的透明度为0. 使用这种机制必须采用BufferedImage.TYPE_INT_ARGB的图像,并且输出支持alpha通道的格式。

Happy new year with Yan 0.4

I am glad to release the Yan 0.4 at the last night of 2009. It’s an important release which witnesses the improvement on both code and the project itself. We have great changes in all modules.  Packages have been rearranged and renamed to be more comprehensible. Let’s dive into the changeset:

Changeset

  • ApiKey database derby / h2 support, still use hsql as default because it’s fastest (#9)
  • Captcha provider classes now loaded dynamically on runtime. They are not managed by guice container any longer. (#15)
  • The useless cache module was completely removed (#10)
  • ApiKey CRUD UI has been replaced by RESTful GET/PUT/DELETE interfaces
  • For text-based captcha, just return the question in ticket, no need for (also impossible to)  retrieve it from browser (#8)
  • Resource has been separated from the project file (#14 #18)
  • Add test to make sure the /ticket and /validate request are sent by the same application (#17)
  • Standardized error output: use HTTP error for client(browser), a selected error object for application (#24 #26)
  • /captcha/ request (invoked by client directly) now accepts configuration parameters
  • ApiKey is now binded to specified domain, it will check the /captcha request’s referer (#27)
  • NEW captcha provider introduced in: Tiled Image Captcha (#12)
  • JMX monitoring support on EhCache (#33)
  • a great deal of code improvements and bug-fixes

Interface changes

The object return by /ticket has its attribute “url” renamed to “data”.

Screenshots

Use visualvm or jconsole the monitor ehcache status and statistics (enabled in 0.4 by default):

The new captcha provider in ruby and python sample application (Sample Code):

Download & Deploy

Since 0.4, yan package are available for download directly. Please refer to the  download page, grab both yan-0.4.war and yan-resource.tar.bz2. Just throw the war package to your servlet container.  Then extract the resource package to your disk. Don’t forget to set the environment variable:
export YAN_RESOURCE=/path/to/your/resource

Start the servlet container in the same context, browser http://localhost:8080/yan-0.4/ to see the test page and emulate the captcha process.

Retrieve the code

Clone the mercurial repository from bitbucket.org

$ hg clone https://sunng@bitbucket.org/sunng/yan/

You will get a copy of whole code repository (because mercurial is a distributed version control system). You are on the default branch at the beginning. The default branch maintains the code of 0.4, if you want to see latest things on Yan, switch to the development branch by

$ hg update 0.5-dev

Yan 0.5 is already on the way.

Reporting Issue

Issue reporting and patch submitting are always welcomed. Check the issue tracker on bitbucket, you will find new features in 0.5

Thanks for your support and !

Hush!

今天新增的拼图验证码的可配置性非常强,你只要替换资源文件,在配置文件中修改提问的模版,指定图片的大小、行数、列数,就可以创造一套全新的验证码。他的简单程度实在超出你的想象。

Web 2.0 Icon Captcha

Yan 新增了一种验证码类型,Web 2.0 图标验证码。用户根据图标的内容和提示的信息,提交验证码。验证码图片如下:

提示文字: Please figure out twitter icons.

用户输入Twitter图标左上角上的字母,即可进行验证。在Yan的测试界面上使用如图:

Web2.0 Icon实际上是Yan中新增的拼图验证码的一个实例,利用拼图验证码可以生成相似的更有创意的验证码。在我的开发环境中生成这样一张图片大约需要80ms。

项目中使用的图标均从互联网收集,遵循CC等协议或经作者授权,详情参考项目中README文件。

祝DAF同学生日快乐。

Load Test on Yan

给Yan的验证码图片服务做了压力测试。测试环境:

  • Intel Xeon 3.00GHz 4核
  • 内存2G
  • Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
  • Jetty 6 / JDK 6

Jetty采用默认配置 maxThreads 200。

测试工具:ab (Apache Bench)

分别用10/50/100/200/500/1000并发用户,每个用户请求100次进行测试。结果如下:

10 50 100 200 500 1000
Requests per second 487.11 472.09 442.74 421.63 408.11 326.12
Time per request 2.05 2.12 2.26 2.37 2.45 3.07
Transfer rate 987.91 955.54 896.85 854.31 826.25 660.45



目前对每个请求独立使用JDK的awt实时绘图,吞吐量可以达到400以上,如果稍稍优化一下Jetty的配置,性能还有一定的提升空间。这个结果还是不错的。