转自:http://my.oschina.net/CandyDesire/blog/209364
生成验证码的方式有很多,个人认为较为灵活方便的是Kaptcha ,他是基于SimpleCaptcha的开源项目。使用Kaptcha 生成验证码十分简单并且参数可以进行自定义。只需添加jar包配置下就可以使用。kaptcha所有配置都可以通过web.xml来完成,如果项目使用了Spring MVC,那么实现方式会略有不同。
一、Servlet项目
1、添加jar包依赖
maven项目,在pom.xml中添加dependency
1
2
3
4
5
6
|
<!-- kaptcha -->
<dependency>
<groupId>com.google.code.kaptcha</groupId>
<artifactId>kaptcha</artifactId>
<version>
2.3
.
2
</version>
</dependency>
|
非maven项目,在官网下载kaptcha的jar包,然后添加到项目lib库中。
下载地址:http://code.google.com/p/kaptcha/downloads/list
2、配置web.xml
1
2
3
4
5
6
7
8
|
<servlet>
<servlet-name>Kaptcha</servlet-name>
<servlet-
class
>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-
class
>
</servlet>
<servlet-mapping>
<servlet-name>Kaptcha</servlet-name>
<url-pattern>/kaptcha.jpg</url-pattern>
</servlet-mapping>
|
注:url-pattern 自定义
kaptcha的参数都有默认值,如果要配置kaptcha,在init-param增加响应的参数即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<servlet>
<servlet-name>Kaptcha</servlet-name>
<servlet-
class
>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-
class
>
<init-param>
<param-name>kaptcha.image.width</param-name>
<param-value>
200
</param-value>
<description>Width in pixels of the kaptcha image.</description>
</init-param>
<init-param>
<param-name>kaptcha.image.height</param-name>
<param-value>
50
</param-value>
<description>Height in pixels of the kaptcha image.</description>
</init-param>
<init-param>
<param-name>kaptcha.textproducer.
char
.length</param-name>
<param-value>
4
</param-value>
<description>The number of characters to display.</description>
</init-param>
<init-param>
<param-name>kaptcha.noise.impl</param-name>
<param-value>com.google.code.kaptcha.impl.NoNoise</param-value>
<description>The noise producer.</description>
</init-param>
</servlet>
|
3、jsp代码
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
|
<script type=
"text/javascript"
>
$(function(){
//生成验证码
$(
'#kaptchaImage'
).click(function () {
$(
this
).hide().attr(
'src'
,
'/code/captcha-image?'
+ Math.floor(Math.random()*
100
) ).fadeIn(); });
});
window.onbeforeunload = function(){
//关闭窗口时自动退出
if
(event.clientX>
360
&&event.clientY<
0
||event.altKey){
alert(parent.document.location);
}
};
function changeCode() {
//刷新
$(
'#kaptchaImage'
).hide().attr(
'src'
,
'/code/captcha-image?'
+ Math.floor(Math.random()*
100
) ).fadeIn();
event.cancelBubble=
true
;
}
</script>
<div
class
=
"form-group"
>
<label>验证码 </label>
<input name=
"j_code"
type=
"text"
id=
"kaptcha"
maxlength=
"4"
class
=
"form-control"
/>
<br/>
<img src=
"/code/captcha-image"
id=
"kaptchaImage"
style=
"margin-bottom: -3px"
/>
<a href=
"#"
onclick=
"changeCode()"
>看不清?换一张</a>
</div>
|
二、Spring mvc 中使用kaptcha
1、spring 配置文件 applicationContext.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<bean id=
"captchaProducer"
class
=
"com.google.code.kaptcha.impl.DefaultKaptcha"
>
<property name=
"config"
>
<bean
class
=
"com.google.code.kaptcha.util.Config"
>
<constructor-arg>
<props>
<prop key=
"kaptcha.border"
>yes</prop>
<prop key=
"kaptcha.border.color"
>
105
,
179
,
90
</prop>
<prop key=
"kaptcha.textproducer.font.color"
>blue</prop>
<prop key=
"kaptcha.image.width"
>
125
</prop>
<prop key=
"kaptcha.image.height"
>
45
</prop>
<prop key=
"kaptcha.textproducer.font.size"
>
45
</prop>
<prop key=
"kaptcha.session.key"
>code</prop>
<prop key=
"kaptcha.textproducer.char.length"
>
4
</prop>
<prop key=
"kaptcha.textproducer.font.names"
>宋体,楷体,微软雅黑</prop>
</props>
</constructor-arg>
</bean>
</property>
</bean>
|
2、Controller的实现
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
|
import
java.awt.image.BufferedImage;
import
javax.imageio.ImageIO;
import
javax.servlet.ServletOutputStream;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
javax.servlet.http.HttpSession;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Controller;
import
org.springframework.web.bind.annotation.RequestMapping;
import
org.springframework.web.servlet.ModelAndView;
import
com.google.code.kaptcha.Constants;
import
com.google.code.kaptcha.Producer;
@Controller
@RequestMapping
(
"/code"
)
public
class
CaptchaController {
@Autowired
private
Producer captchaProducer =
null
;
@RequestMapping
(value =
"captcha-image"
)
public
ModelAndView getKaptchaImage(HttpServletRequest request, HttpServletResponse response)
throws
Exception {
HttpSession session = request.getSession();
String code = (String)session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
System.out.println(
"验证码: "
+ code );
response.setDateHeader(
"Expires"
,
0
);
response.setHeader(
"Cache-Control"
,
"no-store, no-cache, must-revalidate"
);
response.addHeader(
"Cache-Control"
,
"post-check=0, pre-check=0"
);
response.setHeader(
"Pragma"
,
"no-cache"
);
response.setContentType(
"image/jpeg"
);
String capText = captchaProducer.createText();
session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);
BufferedImage bi = captchaProducer.createImage(capText);
ServletOutputStream out = response.getOutputStream();
ImageIO.write(bi,
"jpg"
, out);
try
{
out.flush();
}
finally
{
out.close();
}
return
null
;
}
}
|
3、kaptcha可配置项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
kaptcha.border 是否有边框 默认为
true
我们可以自己设置yes,no
kaptcha.border.color 边框颜色 默认为Color.BLACK
kaptcha.border.thickness 边框粗细度 默认为
1
kaptcha.producer.impl 验证码生成器 默认为DefaultKaptcha
kaptcha.textproducer.impl 验证码文本生成器 默认为DefaultTextCreator
kaptcha.textproducer.
char
.string 验证码文本字符内容范围 默认为abcde2345678gfynmnpwx
kaptcha.textproducer.
char
.length 验证码文本字符长度 默认为
5
kaptcha.textproducer.font.names 验证码文本字体样式 默认为
new
Font(
"Arial"
,
1
, fontSize),
new
Font(
"Courier"
,
1
, fontSize)
kaptcha.textproducer.font.size 验证码文本字符大小 默认为
40
kaptcha.textproducer.font.color 验证码文本字符颜色 默认为Color.BLACK
kaptcha.textproducer.
char
.space 验证码文本字符间距 默认为
2
kaptcha.noise.impl 验证码噪点生成对象 默认为DefaultNoise
kaptcha.noise.color 验证码噪点颜色 默认为Color.BLACK
kaptcha.obscurificator.impl 验证码样式引擎 默认为WaterRipple
kaptcha.word.impl 验证码文本字符渲染 默认为DefaultWordRenderer
kaptcha.background.impl 验证码背景生成器 默认为DefaultBackground
kaptcha.background.clear.from 验证码背景颜色渐进 默认为Color.LIGHT_GRAY
kaptcha.background.clear.to 验证码背景颜色渐进 默认为Color.WHITE
kaptcha.image.width 验证码图片宽度 默认为
200
kaptcha.image.height 验证码图片高度 默认为
50
|
所有评论(0)