`
hackbomb
  • 浏览: 215054 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

利用session实现一次性验证码

    博客分类:
  • Web
阅读更多

<h3>带有验证码的登录页面</h3>
<form action="servlet/LogonFormServlet" method="post">
用户名:<input type="text" name="name"><br>
密码:<input type="password" name="pass"><br>
验证码:<input type="text" name="check_code">
<img src="servlet/CheckCodeServlet"><br>
<input type="submit" value="登录">
</form>

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.ImageIO;

public class CheckCodeServlet extends HttpServlet
{
    private static int WIDTH=60;
    private static int HEIGHT=20;
    public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
    {
    HttpSession session = request.getSession();
    response.setContentType("image/jpeg");
    ServletOutputStream sos=response.getOutputStream();

    //设置浏览器不要缓存此图片
    response.setHeader("Pragma","No-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires",0);

    //创建内容图片并获得其图形上下文
    BufferedImage image=new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
    Graphics g=image.getGraphics();

    //产生随机的验证码
    char[] rands=generateCheckCode();

    //产生图像
    drawBackground(g);
    drawRands(g,rands);
   
    //结束图像的绘制过程,完成图像
    g.dispose();

    //将图像输出到客户端
    ByteArrayOutputStream bos=new ByteArrayOutputStream();
    ImageIO.write(image,"JPEG",bos);
    byte[] buf=bos.toByteArray();
    response.setContentLength(buf.length);
    //下面的语句也可以写成:bos.writeTo(sos);
    sos.write(buf);
    bos.close();
    sos.close();

    //将当前验证码存入到session中
    session.setAttribute("check_code",new String(rands));
    }
   
    private char[] generateCheckCode()
    {
        //定义验证码的字符表
        String chars="0123456789abcdefghijklmnopqrstuvwxyz";
        char[] rands=new char[4];
        for(int i=0;i<4;i++)
        {
            int rand=(int)(Math.random()*36);
            rands[i]=chars.charAt(rand);
        }
        return rands;
    }

    private void drawRands(Graphics g,char[] rands)
    {
        g.setColor(Color.BLACK);
        g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));
        //在不同的高度上输出验证码的每个字符
        g.drawString(""+rands[0],1,17);
        g.drawString(""+rands[1],16,15);
        g.drawString(""+rands[2],31,87);
        g.drawString(""+rands[3],46,16);
        System.out.println(rands);
    }

    private void drawBackground(Graphics g)
    {
        //画背景
        g.setColor(new Color(0xDCDCDC));
        g.fillRect(0,0,WIDTH,HEIGHT);
        //随即产生120个干扰点
        for(int i=0;i<120;i++)
        {
            int x=(int)(Math.random()*WIDTH);
            int y=(int)(Math.random()*HEIGHT);
            int red=(int)(Math.random()*255);
            int green=(int)(Math.random()*255);
            int blue=(int)(Math.random()*255);
            g.setColor(new Color(red,green,blue));
            g.drawOval(x,y,1,0);
        }
    }
}

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class LogonFormServlet extends HttpServlet
{
    public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
    {
        response.setContentType("text/html;charset=GB2312");
        PrintWriter out=response.getWriter();

        HttpSession session=request.getSession(false);
        if(session==null)
        {
            out.println("验证码处理问题!");
            return ;
        }

        String savedCode=(String)session.getAttribute("check_code");
        if(savedCode==null)
        {
            out.println("验证码处理问题!");
            return ;
        }
       
        String checkCode=request.getParameter("check_code");
        if(!savedCode.equals(checkCode))
        {
        /*验证码未通过,不从session中清楚原来的验证码,
        以便用户可以后退回登录页面继续使用原来的验证码进行登录*/
            out.println("验证码无效!");
            return ;
        }
   
        /*验证码检查通过后,从session中清楚原来的验证码,
        以防用户后退回登录页面继续使用原来的验证码进行登录*/
        session.removeAttribute("check_code");
        out.println("验证码通过,服务器正在校验用户名和密码!");
    }
}

分享到:
评论
1 楼 wenniuwuren 2012-04-01  
不能显示图片..

相关推荐

    JavaWeb 使用Session实现一次性验证码功能

    JavaWeb 使用Session实现一次性验证码功能是指在JavaWeb应用程序中使用Session机制来实现一次性验证码功能,这种方法可以有效地防止机器人和恶意用户对网站的攻击。下面是该功能的详细实现过程: 一、验证码的生成...

    通过Session案例分析一次性验证码登录

    通过Session案例分析一次性验证码登录是指通过使用Session来实现一次性验证码登录的机制。该机制主要通过在Servlet中生成验证码,并将验证码的数据保存在Session中,用户提交验证码后,从Session中取出验证码,并...

    struts2实现验证码

    本教程将详细讲解如何利用Struts2框架来实现验证码功能。 首先,我们需要理解验证码的基本原理。验证码通常是一串随机生成的字符或数字,用户需要正确输入才能完成特定操作,如登录、注册等。它的主要目标是验证...

    用servlet实现动态的生成验证码,点击验证码改变,及验证码的校验

    本教程将详细解释如何使用Servlet技术来实现一个动态的验证码功能,包括点击验证码后更换新的验证码以及验证码的验证过程。 一、Servlet基础 Servlet是Java EE中用于处理HTTP请求的服务器端组件。它接收客户端...

    实现带验证码的注册登录

    除了基本的图像验证码,还可以考虑引入更高级的验证码技术,如谷歌的reCAPTCHA,它利用人工智能技术区分人类和机器人,降低了对用户操作的干扰,同时也增强了安全性。 实现验证码功能还需要注意以下几点: - **...

    Java使用SSM框架实现登录页面的验证码功能

    ### Java使用SSM框架实现登录页面的验证码功能 在现代Web开发中,为了增强网站的安全性,防止自动化脚本攻击,通常会在用户登录时加入验证码功能。本文将详细介绍如何使用SSM(Spring、SpringMVC、MyBatis)框架来...

    jsp验证码实现

    【JSP验证码实现详解】 验证码(CAPTCHA)是一种防止机器自动操作的安全机制,它通过让用户输入图片或音频中显示的随机字符来验证用户是否为真实的人。在JSP(JavaServer Pages)中实现验证码,我们可以利用Java的...

    基于struts1.x的验证码实现

    4. **防止重复提交**:为了增加安全性,可以设置验证码一次有效,即用户输入验证码后,无论是否正确,都会立即清除session中的验证码,防止恶意用户多次尝试。 5. **优化用户体验**:验证码的设计应考虑用户体验,...

    验证码生成类大全

    3. **验证码实现**: - 在Python中,可以使用第三方库如`PIL`(Python Imaging Library)或`opencv-python`来绘制和扭曲字符。 - Java中,可使用`Java.awt`和`java.awt.image`包创建图形验证码,或利用第三方库如`...

    jquery实现验证码功能 完整代码

    例如,对于更高级的安全性,你可以考虑使用无状态验证码(如基于时间的一次性密码TOTP)或图像识别验证码(如谷歌的reCAPTCHA)。同时,记得对用户输入进行适当的验证和清理,防止SQL注入等安全问题。

    用jsp实现中文形式的验证码例子

    在IT行业中,验证码是一种常见的安全机制,用于防止自动化的机器人或恶意软件进行非法操作,例如注册、登录或者提交表单。本示例将探讨如何使用Java Server Pages (JSP) 技术来实现中文形式的验证码。JSP是Java平台...

    VS中通过Session实现网站安全机制

    为了解决这个问题,我们可以利用Session来实现在各个页面间的用户验证。 1. **验证界面**: 创建一个名为`judge.aspx`的验证页面。在该页面的`Page_Load`事件处理程序中,我们需要检查Session变量`flag`是否为null...

    Asp.net(C#)实现验证码功能

    3. **验证码实现步骤**: - **生成随机字符串**:首先,你需要生成一个随机字符串,通常包含字母和数字,长度可以在4到6位之间。 - **绘制验证码图像**:使用GDI+(Graphics Device Interface)绘制字符串到图像上...

    java web加法验证码实例

    - 防止重放攻击:每个验证码只能使用一次,使用后即废弃。 通过这个实例,开发者不仅可以学习到验证码的基本实现,还能了解到如何在实际项目中与其他框架进行有效集成,提升系统的安全性。希望这个加法验证码实例...

    js+Servlet实现验证码

    4. **安全考虑**:为了提高安全性,Servlet可能会设置验证码的有效期,比如在一段时间后自动过期,或者在用户尝试多次错误后重置验证码。 在NetBeans这样的集成开发环境中,你可以创建一个Java Web项目,将...

    【uni-app】自定义-图形滑块验证码,后端php 的演示视频

    【uni-app】是一款基于Vue.js开发的多端统一框架,它允许开发者编写一次代码,就能在iOS、Android、H5、微信小程序、支付宝小程序、百度小程序等多个平台运行。本视频教程将聚焦于如何在uni-app中实现一个自定义的...

    JSP彩色验证码的实现.

    通过以上步骤,我们就能在JSP中实现一个彩色且具有汉字和数字的验证码功能。这样的验证码既能提供良好的用户体验,又能有效地防止自动化攻击,确保网站的安全性。在实际应用中,还可以根据需要调整验证码的复杂度,...

    Web验证码的代码

    在这个名为"Web验证码的代码"的项目中,开发者使用JavaScript和Java Web技术实现了一个完整的验证码功能。下面我们将详细探讨这个项目可能涉及的关键知识点。 首先,验证码的生成通常包括以下几个步骤: 1. **随机...

Global site tag (gtag.js) - Google Analytics