用JAVA中BufferedImage画出漂亮的验证码点击变化

如果我们想用JAVA中BufferedImage画出漂亮的验证码点击变化怎么实现呢,类似这样:

点击变化,以下是实现过程,直接上代码:

 首先前台:<i><img style="height:22px;" id="zcodeImg" alt="点击更换" title="点击更换" src="" /></i>放在你页面想展示的位置;接着页面加载时

1
2
3
4
5
$(document).ready( function () {
         changeCode1();
         $( "#codeImg" ).bind( "click" , changeCode1);
     });
 
function changeCode1() {
$("#codeImg").attr("src", "code.do?t=" + genTimestamp());//secCodeController
}

js部分写完了,现在是控制层,直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
@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()));
     }
}

转载于:https://www.cnblogs.com/changqijing/p/7597339.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值