如果我们想用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() { |
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()));
}
}
|