(servelet)验证码

原创 2015年07月07日 08:37:46

验证码的作用

  • 为了防止机器人的破坏操作,可以使用验证码技术来防止恶意的发送数据。
  • 验证码本质上是一张动态产生的图片。
  • 图片的内容会随着程序的运行而随机产生。

验证码的绘制

  • 验证码图片的生成需要使用java提供的与绘图有关的一系列API。
  • 想要绘图,需要画板,画笔,颜料,背景色,字体等多种类对象配合完成。

验证码图片的绘制步骤

  • 1、创建一个内存画板对象
  • 2、获取画笔
  • 3、为画笔指定颜色
  • 4、为画板设置背景色
  • 5、绘制一个随机的字符串
  • 6、修改画笔颜色
  • 7、绘制多条干扰线
  • 8、压缩图片并输出到客户端
package com.verificationCode.servelet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
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;
public class ValidateCode extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public ValidateCode() {
        super();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //0、创建空白图片
        BufferedImage image = new BufferedImage(100, 30, BufferedImage.TYPE_INT_RGB);
        //1、获取图片画笔
        Graphics g = image.getGraphics();
        Random r = new Random();
        //2、设置画笔颜色
        g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
        //3、绘制矩形的背景
        g.fillRect(0, 0, 100, 30);
        //4、调用自定义的方法,获取长度为5的字母数字组合的字符串
        String number = getNumber(5);
        HttpSession session = request.getSession();
        session.setAttribute("code", number);
        g.setColor(new Color(0, 0, 0));
        g.setFont(new Font(null, Font.BOLD, 24));
        //5、设置颜色字体后,绘制字符串
        g.drawString(number, 5, 25);
        //6、绘制8条干扰线
        for(int i = 0;i<8;i++){
            g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255), r.nextInt(255)));
            g.drawLine(r.nextInt(100), r.nextInt(30), r.nextInt(100), r.nextInt(30));
        }
        response.setContentType("image/jpeg");
        OutputStream ops = response.getOutputStream();
        ImageIO.write(image, "jpeg", ops);
        ops.close();
    }

    private String getNumber(int size){
        String str = "ASDFGHJLPOIUYTREWQZXCVBNM";
        String number = "";
        Random r = new Random();
        for(int i = 0 ; i<size;i++){
            number += str.charAt(r.nextInt(str.length()));
        }
        return number;
    }
}

验证码的验证流程

  • 请求带有验证码的页面时:
    • 通过img标签的src属性获取验证码图片
    • 服务器端生成随机字符串,并绘制
    • 服务器端将生成的随机字符串绑定到session中
  • 提交表单及填写的验证码内容时:
    • 处理程序将session中绑定的正确的验证码字符串取出来
    • 获取表单提交时填写的验证码内容
    • 比较两者,根据结果做出判断
package com.verificationCode.servelet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class ActionServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public ActionServlet() {
        super();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String uri = request.getRequestURI();
        String action = uri.substring(uri.lastIndexOf("/")+1, uri.lastIndexOf("."));
        //判断动作是否为登录
        if(action.equals("login")){
            String name = request.getParameter("uname");
            String pwd = request.getParameter("pwd");
            String number = request.getParameter("vcode");
            HttpSession session = request.getSession();
            String code = session.getAttribute("code").toString();
            if(number.equals(code)&&name.equals("111")&&pwd.equals("111")){
                //编程式--设定session超时时间为10秒
                //session.setMaxInactiveInterval(10);
                session.setAttribute("uname", name);
                //重定向到首页
                //response.sendRedirect("index.jsp");
                response.sendRedirect(response.encodeRedirectUrl("index.jsp"));
            } else{
                //登录失败
                request.setAttribute("msg", "用户名或密码错误");
                request.getRequestDispatcher("login.jsp").forward(request, response);
            }
        }else if(action.equals("logout")){
            HttpSession session = request.getSession();
            //session失效
            session.invalidate();
            response.sendRedirect("login.jsp");
        }
        out.close();
    }
}
login.jsp代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type="text/javascript"></script>
<style type="text/css">
    .s1 {
        cursor: pointer;
    }
</style>
</head>

<body>
    <form action="" method="post">
        姓名:<input type="text" /><br> 
        密码:<input type="password" /><br>
        验证码:<input type="text" /> 
        <img src="code" onclick="this.src='code?'+Math.random()" class="s1" title="点击更换"><br>
        <input type="submit" value="提交" />
    </form>
</body>
</html>
web.xml代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>verificationCode</display-name>

  <servlet>
    <servlet-name>ValidateCode</servlet-name>
    <servlet-class>com.verificationCode.servelet.ValidateCode</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ValidateCode</servlet-name>
    <url-pattern>/code</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>ActionServlet</servlet-name>
    <servlet-class>com.verificationCode.servelet.ActionServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ActionServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
</web-app>
版权声明:本文为博主原创文章,允许转载,请标明出处。

Jmeter工具对验证码的处理方法

  • 2017年11月02日 14:24
  • 1.59MB
  • 下载

jmeter 使用时间戳去redis获取验证码实现有验证码登录接口测试

jmeter作为一款易学易用的接口压测工具,已经受到大多数啄木鸟同学的青睐。 jmeter 使用时间戳去redis获取验证码实现有验证码登录接口测试...
  • zike6524
  • zike6524
  • 2017年09月29日 11:10
  • 914

jmeter 使用cookie和jdbc获取注册 验证码

问题: 用jmeter批量注册新账号,注册时有验证码。 方法: 让开发禁用注册码,或在测试环境写个固定的验证码;在jmeter中用cookie jdbc获取数据库中验证码 思路: 观察发现...
  • qq284489030
  • qq284489030
  • 2017年06月14日 02:10
  • 1192

Jmeter+Badbody 实现带登录的压力测试

工具Badbody 下载地址:http://www.badboy.com.au/ Jmeter 下载地址:http://jmeter.apache.org/ 都是免费的可以放心下载录制脚本打开Ba...
  • yangwei19680827
  • yangwei19680827
  • 2016年11月12日 13:17
  • 4194

jmeter进行web测试

  • 2017年10月16日 10:59
  • 13.5MB
  • 下载

java实现登录验证码

java实现登录验证码:用兴趣的同学     可以参考一下: VerifyCodeServlet.java类: package com.spring.controller; impor...
  • u010363836
  • u010363836
  • 2013年10月15日 21:14
  • 3094

jmeter给cookie设置sessionId避免其他脚本多次登录

1、相关知识: http头部可以设置:浏览器显示内容类型,如content-type:text/html http头部可以存放:浏览器的cookie信息——cookie是对用户身份进行判断的内容 ...
  • XiaoXiao_RenHe
  • XiaoXiao_RenHe
  • 2017年12月25日 16:52
  • 120

windows绕过登陆验证工具

  • 2014年02月24日 16:35
  • 5.46MB
  • 下载

身份认证列表的业务实现

身份认证列表的业务实现 一般用户修改/重置支付密码、登录密码等业务实现时,我们需要用户进行几步身份认证,才可让其他通过。 先贴一个类似的效果图:展示了几个认证流程(流程中的几个认证步骤暂没图...
  • doctor_who2004
  • doctor_who2004
  • 2017年01月09日 17:22
  • 641

有关前台验证和后台验证

正常来说,前台验证和后台验证是都要有的。 因为JS验证不安全,如果有意为之,那么完全可以绕过你的JS验证。 如果你开发的是商业应用,那么稳定性和安全性是相当重要的,而这里就存在有安全漏洞。 客...
  • qq_15936309
  • qq_15936309
  • 2016年04月07日 17:03
  • 6645
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(servelet)验证码
举报原因:
原因补充:

(最多只允许输入30个字)