相信在很多情况下,大家都有会用上验证码的情况!这里,我给大家讲讲我写验证码的两种方式我这里用的是Spring的方式,所以Spring的jar包是必须的,如果大家不想用Spring的话,可以去除Spring,只需轻微的改动代码就可以了!先给大家罗列代码模块,jsp模块最后列出
首先给大家讲讲不用jar包的方式吧,由于这个是用Spring写的,所以我的service方法上面有个Spring的注解,按照我的理解,代码内部基本没有用到Spring的其他功能,所以如果想改成Servlet或者struts2的话,把注解去掉,直接复制代码内容就OK啦
public Color getRandColor(int s, int e) {
Random random = new Random();
if (s > 255) s = 255;
if (e > 255) e = 255;
int r = s + random.nextInt(e - s);
int g = s + random.nextInt(e - s);
int b = s + random.nextInt(e - s);
return new Color(r, g, b);
}
@RequestMapping(value="/captcha-p_w_picpath")
public void service(HttpServletRequest request, HttpServletResponse response) {
//禁止缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);
// 指定生成的响应是图片
response.setContentType("p_w_picpath/jpeg");
int width = 128;
int height = 36;
BufferedImage p_w_picpath = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB); //创建BufferedImage类的对象
Graphics g = p_w_picpath.getGraphics(); //创建Graphics类的对象
Graphics2D g2d=(Graphics2D)g; //通过Graphics类的对象创建一个Graphics2D类的对象
Random random = new Random(); //实例化一个Random对象
Font mFont = new Font("华文宋体", Font.BOLD, 30); //通过Font构造字体
g.setColor(getRandColor(200, 250)); //改变图形的当前颜色为随机生成的颜色
g.fillRect(0, 0, width , height); //绘制一个填色矩形
//画一条折线
BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //创建一个供画笔选择线条粗细的对象
g2d.setStroke(bs); //改变线条的粗细
g.setColor(Color.DARK_GRAY); //设置当前颜色为预定义颜色中的深灰色
int[] xPoints=new int[3];
int[] yPoints=new int[3];
for(int j=0;j<3;j++){
xPoints[j]=random.nextInt(width - 1);
yPoints[j]=random.nextInt(height - 1);
}
g.drawPolyline(xPoints, yPoints,3);
//生成并输出随机的验证文字
g.setFont(mFont);
String sRand="";
int itmp=0;
for(int i=0;i<4;i++){
if(random.nextInt(2)==1){
itmp=random.nextInt(26)+65; //生成A~Z的字母
}else{
itmp=random.nextInt(10)+48; //生成0~9的数字
}
char ctmp=(char)itmp;
sRand+=String.valueOf(ctmp);
Color color=new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110));
g.setColor(color);
/****随机缩放文字并将文字旋转指定角度**/
//将文字旋转指定角度
Graphics2D g2d_word=(Graphics2D)g;
AffineTransform trans=new AffineTransform();
trans.rotate(random.nextInt(30)*3.14/180,15*i+10,7);
//缩放文字
float scaleSize=random.nextFloat()+0.8f;
if(scaleSize>1.1f) scaleSize=1f;
trans.scale(scaleSize, scaleSize);
g2d_word.setTransform(trans);
/************************/
g.drawString(String.valueOf(ctmp),20*i+40,16);
}
//将生成的验证码保存到Session中
HttpSession session=request.getSession(true);
session.setAttribute("randCheckCode",sRand);
g.dispose();
try {
ImageIO.write(p_w_picpath,"JPEG",response.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
而获取验证码的话,肯定要用户输入验证码进行比较,而进行比较的代码就是下面的代码(只是获得session,比较自己进行)
session.getAttribute("randCheckCode");
而下面给大家介绍使用jar包的方法,在这里,我们除了用到了Spring的必须jar包之外,还用到了kaptcha-2.3.2.jar,虽说以下也是用Spring的方式写的,但如果想改成Servlet或者其他方式的话,只需要把配置文件小小的修改下一样的OK啊!好了,废话不多说了,说说怎样使用吧
@RequestMapping(value="/captcha-p_w_picpath")
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setDateHeader("Expires", 0);
// 设置标准的HTTP / 1.1无缓存头文件
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
// 设置IE扩展HTTP / 1.1无缓存头文件(使用addheader)
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
// 设置标准的HTTP / 1.0无缓存头文件
response.setHeader("Pragma", "no-cache");
// 返回一个jpeg格式的图片
response.setContentType("p_w_picpath/jpeg");
// 创建用于图片的文本
String capText = captchaProducer.createText();
// 将文本存储在session中
request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);
// 在图像上穿件文本
System.out.println(capText);
BufferedImage bi = captchaProducer.createImage(capText);
ServletOutputStream out = response.getOutputStream();
// 写出数据
ImageIO.write(bi, "jpg", out);
try {
out.flush();
} finally {
out.close();
}
}
然而,同样的问题是,我们输出了验证嘛,这个验证嘛要与用户输入的验证码进行比较与判断,我这里同样也是只说获取方式,能够获取到输出的验证码字符串,至于用户输入的验证码与怎样比较,就需要大家用自己的方式来写代码啦,以下就是获取输出的验证码字符串的代码
String kaptchaExpected = (String) request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
当然,在这里,只有代码就不够啦,我们还需要写配置文件,下面的配置文件是配置在Spring的配置文件里面的啊,如果想把代码改为Servlet模式的话,把该配置文件修改一下,配置到web.xml里面就可以啦!至于在struts2里面怎么配,那我还真没试过,如果有人感兴趣可以试试,然后给我说说吧,把经验分享给大家
<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">black</prop>
<!-- 验证码字体颜色 -->
<prop key="kaptcha.textproducer.font.color">black</prop>
<!-- 验证码宽度 -->
<prop key="kaptcha.p_w_picpath.width">128</prop>
<!-- 验证码高度 -->
<prop key="kaptcha.p_w_picpath.height">36</prop>
<!-- 验证码字体大小 -->
<prop key="kaptcha.textproducer.font.size">36</prop>
<!-- 获取验证码的名字session -->
<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>
那么,现在就来说说前端代码吧,前端需要几个功能,界面刚加载出来就要有验证嘛,并且点击验证码代表的是看不清验证码的内容,点击之后要换张验证码图片!并且还有点击看不清的a标签,点击之后也要更换验证码图片!这里,我们用到了javascript的框架jquery!下面,就是我们的前端代码
$(function(){
$("img").click(function(){
$("#img").attr("src","captcha-p_w_picpath");
});
});
function change(){
$("#img").attr("src","captcha-p_w_picpath");
}
<img id="img" src="captcha-p_w_picpath" />
<a href="change()">看不清< /a>
<img id="img" src="captcha-p_w_picpath" />
<a href="change()">看不清< /a>
用Spring来写验证码的方式还用Spring Security,但是我还没看懂怎么用,所以就不列举方法啦!但还是给大家提提有这个方式,有兴趣的朋友可以自己看看!
转载于:https://blog.51cto.com/glgordon1993/1260533