如果我们想用JAVA中BufferedImage画出漂亮的验证码点击变化怎么实现呢,类似这样:
点击变化,以下是实现过程,直接上代码:
首先前台:<i><img style="height:22px;" id="zcodeImg" alt="点击更换" title="点击更换" src="" /></i>放在你页面想展示的位置;接着页面加载时
12345 | $(document).ready( function () { changeCode1(); $( "#codeImg" ).bind( "click" , changeCode1); }); function changeCode1() { |
js部分写完了,现在是控制层,直接上代码:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | @Controller @RequestMapping( "/code" ) public class SecCodeController { @RequestMapping public void generate(HttpServletResponse response){ ByteArrayOutputStream output = new ByteArrayOutputStream(); String code = drawImg(output); Subject currentUser = SecurityUtils.getSubject(); Session session = currentUser.getSession(); session.setAttribute(Const.SESSION_SECURITY_CODE, code); try { ServletOutputStream out = response.getOutputStream(); output.writeTo(out); out.close(); } catch (IOException e) { //e.printStackTrace(); } } private String drawImg(ByteArrayOutputStream output){ String code = "" ; for (int i=0; i<4; i++){ code += randomChar(); } int width = 70; int height = 25; BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR); Font font = new Font( "Times New Roman" ,Font.PLAIN,20); Graphics2D g = bi.createGraphics(); g.setFont(font); Color color = new Color(66,2,82); g.setColor(color); g.setBackground( new Color(226,226,240)); g.clearRect(0, 0, width, height); FontRenderContext context = g.getFontRenderContext(); Rectangle2D bounds = font.getStringBounds(code, context); double x = (width - bounds.getWidth()) / 2; double y = (height - bounds.getHeight()) / 2; double ascent = bounds.getY(); double baseY = y - ascent; g.drawString(code, (int)x, (int)baseY); g.dispose(); try { ImageIO.write(bi, "jpg" , output); } catch (IOException e) { //e.printStackTrace(); } return code; } private char randomChar(){ Random r = new Random(); String s = "ABCDEFGHJKLMNPRSTUVWXYZ0123456789" ; return s.charAt(r.nextInt(s.length())); } } |