JSF超精简UUID验证码图片
事无巨细,网上看了下人家写的验证码,起码用到了2~3个循环,并且实现在Tomcat服务器下,看上去没什么大问题,但是每秒的并发数太高了,连最好的安腾处理器恐怕都难以应付,我们这边是企业宏观应用,几十个子站点都靠这一个验证码,最简单的办法当然是每个子站写一个,但是实际情况是有出入的,所以我还得在一张小小的验证码下花点功夫。除开考虑性能外,并且还要缩减代码量。提高效率、降低服务器负载,设法支持企业级服务器容器,经过研究和前端架构师的磨合,让验证码透明并且取消自己生成干扰码(减少了一个循环和随机组)让验证码背景干扰码用静态图片前端自动变换,最后得出一个能有效降低服务器负载的写法,既然我构建于javaEE,数字问题就UUID解决好了(又少了个循环),因此这个验证码当中完全没有循环。原创代码。servlet和JSP通用还确保支持weblogic、glassfish、geronimo、resin、JBoss等企业级服务器
<%@ page contentType="image/PNG" import="java.util.*,java.awt.*,java.io.*,java.awt.image.*,javax.imageio.*" pageEncoding="utf-8"%> <% response.setContentType("image/png"); response.setHeader("Pragma","no-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader ("Expires", -1); //透明的背景88*31 BufferedImage buffImg = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(88, 31, Transparency.TRANSLUCENT); Graphics2D g2d = buffImg.createGraphics(); g2d.setColor(Color.red); g2d.setFont(new Font("Times New Roman",Font.PLAIN,18)); String uuid4 = UUID.randomUUID().toString(); uuid4 = uuid4.substring(0,4); g2d.drawString(uuid4, 4, 29); ImageIO.write(buffImg, "PNG", response.getOutputStream()); response.getOutputStream().close(); out.clear(); out = pageContext.pushBody(); %>