jsp页面添加随机验证码

来源:互联网 发布:软件外包开发规范 编辑:程序博客网 时间:2024/06/05 21:17

1.用servlet类创建的一个随机验证码

/**
 * 生成随机图形验证码
 */
package com.qrsx.oa.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * houjian
 *
 * OA:2013-4-28
 */
public class AuthImg extends HttpServlet {

    private static final long serialVersionUID = 1L;
    // 设置图形验证码中图片和字体大小;
    private Font myFont = new Font("Arial Black", Font.PLAIN, 16);

    public void init() {
        try {
            super.init();
        } catch (ServletException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成随机颜色;
     *
     * @param fc
     * @param bc
     * @return
     */
    private Color getRandColor(int fc, int bc) {
        Random random = new Random();
        if (fc > 255)
            fc = 255;
        if (bc > 255)
            bc = 255;
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }

    /**
     * 生成随机字符;
     *
     * @return
     */
    private String getRandomChar() {
        int rand = (int) Math.round(Math.random() * 2);
        long itmp = 0;
        char ctmp = '\u0000';
        // 根据rand的值来决定生成大写字母,小写字母,数字
        switch (rand) {
        // 生成大写字母;
        case 1:
            itmp = Math.round(Math.random() * 25 + 65);
            ctmp = (char) itmp;
            return String.valueOf(ctmp);
        case 2:
            itmp = Math.round(Math.random() * 25 + 97);
            ctmp = (char) itmp;
            return String.valueOf(ctmp);
        default:
            itmp = Math.round(Math.random() * 9);
            return String.valueOf(itmp);
        }
    }

    /**
     * 生成服务器响应的service方法;
     */
    public void service(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        // 阻止生成的页面被缓存,保证每次重新生成新的随机验证码;
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "No-cache");
        response.setDateHeader("Expires", 0);
        response.setContentType("image/jpeg");
        // 设置图形验证码的大小;
        int width = 100, height = 18;
        // 生成一张新图片;
        BufferedImage image = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        // 在图片中绘制内容;
        Graphics g = image.getGraphics();
        Random random = new Random();
        g.setColor(getRandColor(200, 205));
        g.fillRect(1, 1, width - 1, height - 1);
        g.setColor(new Color(102, 102, 102));
        g.drawRect(0, 0, width - 1, height - 1);
        g.setFont(myFont);
        // 生成随机线条让图片显得很乱;
        g.setColor(getRandColor(160, 200));
        for (int i = 0; i < 155; i++) {
            int x = random.nextInt(width - 1);
            int y = random.nextInt(height - 1);
            int x1 = random.nextInt(6) + 1;
            int y1 = random.nextInt(12) + 1;
            g.drawLine(x, y, x + x1, y + y1);
        }
        for (int i = 0; i < 70; i++) {
            int x = random.nextInt(width - 1);
            int y = random.nextInt(height - 1);
            int x1 = random.nextInt(12) + 1;
            int y1 = random.nextInt(6) + 1;
            g.drawLine(x, y, x - x1, y - y1);
        }
        // 设置变量用于保存随机生成的字符串;
        String sRand = "";
        for (int i = 0; i < 6; i++) {
            String tmp = getRandomChar();
            sRand += tmp;
            // 将系统随机生成的随机字符添加到图形验证码图片上去;
            g.setColor(new Color(20 + random.nextInt(110), 20 + random
                    .nextInt(110), 20 + random.nextInt(110)));
            g.drawString(tmp, 15 * i + 10, 15);
        }
        // 取得用户的session
        HttpSession session = request.getSession(true);
        // 将系统生成的图形验证码添加到用户session中去;
        session.setAttribute("rand", sRand);
        g.dispose();
        // 输出图形验证码图片;
        ImageIO.write(image, "JPEG", response.getOutputStream());
    }
}
2.在web.xml文件中添加servlet

    <servlet>  
        <servlet-name>authImg</servlet-name>  
        <servlet-class>com.qrsx.oa.util.AuthImg</servlet-class>  
    </servlet>  
      
    <servlet-mapping>  
        <servlet-name>authImg</servlet-name>  
        <url-pattern>/authImg</url-pattern>  
    </servlet-mapping>
3.在前台页面中添加图片

<img id="authImg" src="/authImg"/>

<a href="#" onclick="refresh()">看不清</a>

<script type="text/javascript">
  function refresh(){
     document.getElementById("authImg").src='authImg?now='+new Date();
  }
</script>

4.在action中验证你输入的验证码是否正确

public class loginAction  extends  ActionSupport

private String user;

private String password;

private String vercode;

/**get and  set 方法**/

public  String execute ()throws Exception{

//取出用户session

ActionContext act = ActionContext.getContext();

Map session=act.getSession();

//取出系统随机生成的验证码

String str=session.get("rand");

//强制系统随机验证码失效;

session.put("rand",null);

if(vercode.equal(str)){

/*业务逻辑代码段

}else{

return "input"

}

}

原创粉丝点击