`
zzjjun0000
  • 浏览: 23515 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Session实现一次性验证码

    博客分类:
  • JAVA
 
阅读更多
<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("验证码通过,服务器正在校验用户名和密码!");
    }
}

转载:http://blog.csdn.net/mr_walter/article/details/7878267
分享到:
评论

相关推荐

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

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

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

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

    javaweb简单的一次性验证码

    本项目提供的“javaweb简单的一次性验证码”是一个基于Servlet实现的简单验证码系统,旨在帮助初学者理解验证码的工作原理及其在Web应用中的应用。 验证码的主要目的是防止恶意机器人或爬虫进行自动化注册、登录或...

    java实现给手机发送验证码

    在IT行业中,尤其是在网络安全和身份验证领域,手机验证码是一种常用的技术手段,用于确保用户的身份真实性。在本场景中,我们将探讨如何使用Java编程语言来实现手机验证码的发送,以及涉及的相关知识点。 首先,...

    图形验证码(jsp实现)

    通过以上步骤,我们可以使用JSP技术实现一个基本的图形验证码系统。然而,随着技术的发展,验证码也在不断进化,例如滑动验证、点击验证等新型验证码方式,以平衡用户体验和安全性。因此,开发者应持续关注验证码...

    Ext3.0 实现验证码

    生成的验证码字符串应该存储在一个临时或者session级别的变量中,以便后续的验证。 在用户输入验证码后,前端会将输入的值与服务器保存的验证码进行比较。如果匹配成功,验证通过;否则,提示用户重新输入。这通常...

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

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

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

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

    实现带验证码的注册登录

    验证码通常用于区分人类用户与计算机程序,通过完成一个简单的人工可解但机器难以自动完成的任务来验证用户身份。 验证码有多种类型,如图像验证码、滑动验证码、点击验证码、音频验证码等。在这个项目中,我们将...

    struts2实现验证码

    5. **验证用户输入**:当用户输入验证码并提交时,Struts2会调用另一个Action来验证用户输入的验证码是否与session中的验证码匹配。如果匹配,允许用户继续操作;如果不匹配,则提示用户重新输入。 6. **处理重试和...

    servlet实现验证码

    - **一次性使用**:每次验证后,应清除session中的旧验证码,生成新的验证码。 7. **优化** - **缓存控制**:通过设置HTTP响应头,避免浏览器缓存验证码图像,确保每次请求都得到新的验证码。 - **可访问性**:...

    Java发送邮箱验证码、session校验功能.zip_FFN_java邮箱验证码_session校验功能_邮箱验证

    2. **验证码生成**: 验证码可以是随机生成的一串数字或字母组合,也可以通过复杂的算法生成,如基于时间的一次性密码(TOTP)或哈希函数。生成的验证码需要存储在一个安全的地方,以便后续校验。 3. **邮件模板**: ...

    jsp验证码实现

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

    JAVA实现注册页面验证码刷新

    - **会话(Session)**:为了保持验证码的一次性,我们需要将其存储在用户的会话中。在Java中,`HttpSession`对象可以用来保存数据,并关联到特定的客户端会话。当用户提交表单时,服务器会检查会话中的验证码是否...

    基于struts1.x的验证码实现

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

    实现发送手机验证码

    为了安全起见,生成验证码后应存储在服务器的会话(Session)或者缓存中,以便后续验证。 5. **发送请求**:使用SDK封装好的方法,将手机号和验证码作为参数发送给短信服务提供商。发送过程中,可能需要处理网络...

    java,C#,PHP等实现手机发送验证码Demo

    验证码是一种常见的身份验证机制,广泛应用于手机应用和网站中,以确保用户操作的安全性。本文将深入探讨如何使用Java、C#和PHP编程语言来实现手机发送验证码的功能,并结合相关Demo进行详细解释。 首先,我们要...

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

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

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

    - 验证码过期策略,比如用户多次输入错误后,强制更换验证码。 - 考虑可访问性,提供音频验证码供视觉障碍者使用。 - 使用更复杂的干扰元素,防止OCR工具自动识别。 通过以上步骤,我们可以成功地在JSP中实现中文...

    验证码生成类大全

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

Global site tag (gtag.js) - Google Analytics