java后台代码:
package com.supermap.earth.rims.action; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import javax.imageio.ImageIO; import javax.persistence.Entity; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /***************************************************** * 图形验证码Action * @author * * @since 2011-11-20 * *****************************************************/ @Entity public class PicCodeAction extends BaseAction { private static final long serialVersionUID = 1L; private static int width = 60; private static int height = 20; @Override public String execute() throws Exception { HttpSession session = this.getSession(); HttpServletResponse response = this.getResponse(); response.setContentType("image/jpeg"); ServletOutputStream sos = response.getOutputStream(); //设置浏览器不要缓存此图片 response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); //创建内存图象并获得其图形上下文 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); //产生随机的认证码 char[] rands = generateCheckCode(); //产生图像 drawBackground(g); drawRands(g, rands); //结束图像的绘制过程,完成图像 g.dispose(); //将图像输出到客户端 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ImageIO.write(image, "JPEG", bos); byte[] buf = bos.toByteArray(); response.setContentLength(buf.length); //下面的语句也可写成:bos.writeTo(sos); sos.write(buf); bos.close(); sos.close(); //将当前验证码存入到Session中 session.setAttribute("check_code", new String(rands)); //直接使用下面的代码将有问题,Session对象必须在提交响应前获得 //request.getSession().setAttribute("check_code",new String(rands)); return null; } private char[] generateCheckCode() { //定义验证码的字符表 String chars = "0123456789"; char[] rands = new char[4]; for (int i = 0; i < 4; i++) { int rand = (int) (Math.random() * 10); rands[i] = chars.charAt(rand); } return rands; } private void drawRands(Graphics g, char[] rands) { g.setColor(Color.BLACK); g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18)); //在不同的高度上输出验证码的每个字符 g.drawString("" + rands[0], 1, 17); g.drawString("" + rands[1], 16, 15); g.drawString("" + rands[2], 31, 18); g.drawString("" + rands[3], 46, 16); } private void drawBackground(Graphics g) { //画背景 g.setColor(new Color(0xABDCEC)); g.fillRect(0, 0, width, height); //随机产生120个干扰点 for (int i = 0; i < 10; i++) { int x = (int) (Math.random() * width); int y = (int) (Math.random() * height); int red = (int) (Math.random() * 255); int green = (int) (Math.random() * 255); int blue = (int) (Math.random() * 255); g.setColor(new Color(red, green, blue)); g.drawOval(x, y, 1, 0); } } }
xml配置:
<struts> <package name="piccode" extends="default" namespace="/piccode"> <action name="piccode" method="execute" class="com.supermap.earth.rims.action.PicCodeAction"> </action> </package> </struts>
前台Jsp页面代码:
<p> <label for="piccode" style="font-size: 20"> 验证码:</label> <input class="authenticode" type="text" name="piccode" id="piccode" maxlength="4" style="width: 105px;vertical-align: middle;" value="${piccode}" /><img src="${ctx}/piccode/piccode.do" id="code" alt="点击刷新" style="cursor:hand;vertical-align: middle;" onclick="refreshcode();"/> <span style="" id="piccode_tip"></span> </p>
和 js中的刷新function:
function refreshcode(){ $('#code').attr('src','${ctx}/piccode/piccode.do?abc='+new Date()); }