相信在很多情况下,大家都有会用上验证码的情况!这里,我给大家讲讲我写验证码的两种方式我这里用的是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>

       用Spring来写验证码的方式还用Spring Security,但是我还没看懂怎么用,所以就不列举方法啦!但还是给大家提提有这个方式,有兴趣的朋友可以自己看看!然后还是厚着脸皮的说说吧,如果试了的话,并且成功了的话,把你用Spring Security写验证码的经验分享给我一下吧,嘿嘿,小六先谢过啦!