最近有空,所以打算将自己写的一个简单web应用从Windows+tomcat移植到Ubuntu+nginx+tomcat/jetty上。本想应该会比较顺利,等到加载index页面之后,发现之前windows下正常显示的校验码一直无法刷新出来。
然而手动测试分别向nginx和tomcat发送验证码请求,响应都是正常的。说明问题可能不是出在web容器上:
继续查看tomcat日志,一个NoClassDefFoundError异常引起我的注意:
Caused by: java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/JPEGCodec
at com.google.code.kaptcha.impl.DefaultKaptcha.createImage(DefaultKaptcha.java:91)
at com.google.code.kaptcha.servlet.KaptchaServlet.doGet(KaptchaServlet.java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
... 26 more
问题可能出现在开源的验证码工具kaptcha上,查看源码发现kaptcha在创建图片的过程中找不到JRE的扩展库JPEGCodec,经过对比发现同样为JRE 7U79版本,Windows JRE 有该类,但是ubutu URE的该类则在rt.jar\com\sun\imageio\plugins\jpeg下,现在问题原因就明了了:kaptcha 2.0与ubuntu jre 7u79存在兼容性问题。
解决办法:
使用当前主流的kaptcha 2.3.2作为验证码三方包。
官方下载地址(似乎google code已经关门谢客,或者被墙了,如果连不上可参考第二个链接):
http://code.google.com/p/kaptcha/
http://www.java2s.com/Code/Jar/k/Downloadkaptcha23jar.htm
maven配置2.3.2打包到环境验证,图片终于出来了,不过这验证码是什么鬼啊!!!看来kaptcha 2.3.2配置也是不兼容2.0的: