Servlet Session(httpsession)验证输入的验证码是否正确

用户在访问登录页面Login的时候,Login页面会去请求CreateCode这个Servlet生成验证码,然后显示在自己的页面上,然后再提交到LoginClServlet进行验证。很显然,访问Login和请求CreateCode这是从浏览器发出的两次不同的请求,所以,CreateCode产生的验证码字符串必须放入Session中,才能让LoginClServlet拿到,然后进行验证。

java结构

Servlet Session(httpsession)验证码结构图

1. 生成验证码

//CreateCode.jsp
public class CreateCode extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 7.禁止浏览器缓存随机图片
        response.setDateHeader("Expires", -1);
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");

        // 6.通知客户机以图片方式打开发送过去的数据
        response.setHeader("Content-Type", "image/jpeg");

        // 1.在内存中创建一幅图片
        BufferedImage image = new BufferedImage(110, 30,
                BufferedImage.TYPE_INT_BGR);

        // 2.向图片上写数据
        Graphics g = image.getGraphics();

        // 设背景色
        g.setColor(Color.white);
        g.fillRect(0, 0, 110, 30);

        String checkcode = "";
        // 画5个验证码字符
        for(int i=0;i<5;i++){
            g.setColor(generateColor());
            g.setFont(generateFont());
            String str = generateStr();
            checkcode += str;
            g.drawString(str,20*i,25);
        }

        // 画干扰点
        for(int i=0;i<100;i++){
            Random random = new Random();
            int x = random.nextInt(110);
            int y = random.nextInt(30);
            g.setColor(generateColor());
            g.fillOval(x, y, 2, 2);
        }
        // 画干扰线
        for(int i=0;i<5;i++){
            Random random = new Random();
            int x1 = random.nextInt(110);
            int y1 = random.nextInt(30);
            int x2 = random.nextInt(110);
            int y2 = random.nextInt(30);
            g.setColor(generateColor());
            g.drawLine(x1, y1, x2, y2);
        }

        // 这句话就是把随机生成的验证码,保存到session
        // 验证码不区分大小写,所以这里转为小写
        request.getSession().setAttribute("checkcode", checkcode.toLowerCase());

        // 5.把写好数据的图片输出给浏览器
        ImageIO.write(image, "jpg", response.getOutputStream());

    }

    /**
     * 生成随机字体
     * @return
     */
    public Font generateFont() {
        String[] font_names = new String[] { "Broadway", "方正姚体",
                "Footlight MT Light", "Sitka Text", "方正舒体", "幼圆" ,"Colonna MT"};
        int[] font_styles = new int[]{Font.BOLD, Font.ITALIC, Font.BOLD|Font.ITALIC};

        Random random = new Random();
        int name_index = random.nextInt(font_names.length);
        int style_index = random.nextInt(font_styles.length);

        return new Font(font_names[name_index],font_styles[style_index],28);
    }
    /**
     * 生成随机颜色
     * 
     * @return
     */
    public Color generateColor() {
        Random random = new Random();
        return new Color(random.nextInt(256), random.nextInt(256),
                random.nextInt(256));
    }
    /**
     * 生成随机数[0-9a-zA-Z]
     * 
     * @return
     */
    public String generateStr() {
        String[] nums = new String[62];
        // 添加0-9这10个数字
        for (int i = 0; i < 10; i++) {
            nums[i] = String.valueOf(i);
        }
        // 添加A-Z这26个大写字母
        for (int i = 65; i < 91; i++) {
            nums[i - 55] = Character.toString((char) i);
        }
        // 添加a-z这26个小写字母
        for (int i = 97; i < 123; i++) {
            nums[i - 61] = Character.toString((char) i);
        }
        // 产生一个随机数
        Random random = new Random();
        int index = random.nextInt(62);
        return nums[index];
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        this.doGet(request, response);
    }
}

2. 登录界面

out.println("<font color=white>验证码:<input type='text' name='checkcode'/><img src='/mycheckcode/CreateCode'>");

运行结果:

session登录界面

3. 校验验证码

//获取用户的id/password/输入的验证码
String id = request.getParameter("id");
String passwd = request.getParameter("passwd");
// 用户输入的验证码
String input_checkcode = request.getParameter("checkcode");
// 正确的验证码
String checkcode = (String)request.getSession().getAttribute("checkcode");
// 先看验证码对不对
if(input_checkcode.toLowerCase().equals(checkcode)){
    // 验证码OK,再到数据库验证id和passwd
}else{
    request.setAttribute("error", "验证码有误");
    request.getRequestDispatcher("/Login").forward(request, response);
}

登录表单提交到LoginClServlet进行验证,它需要从参数中获取用户输入的验证码,再从Session中取出CreateCode这个Servlet放入Session中的正确的验证码.

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。