验证码2020最新最实用的验证码

CodeServlet验证码servlet

package com.hr.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class CodeServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

    // 定义宽度和高度
    int width = 80;
    int height = 25;
    // 定义当前图片类型(设置高度和宽度)
    BufferedImage bi = new BufferedImage(width, height,
            BufferedImage.TYPE_INT_RGB);
    // 设置一个画板(空白面板)
    Graphics gp = bi.getGraphics();
    // 一.做一个背景色
    // a.设置一个颜色
    gp.setColor(Color.white);
    // b.填充颜色到画板(背景色)
    gp.fillRect(0, 0, width, height);

    // 二.做一个边框
    // a.设置一个颜色
    gp.setColor(Color.GRAY);
    // b.绘制边框(描边)
    gp.drawRect(0, 0, width - 1, height - 1);

    // 三.产生随机的4位数的数字英文字母
    String codes = "";
    Random ran = new Random();
    // a.准备好数字和字母
    String str = "1234567890qwertyuiopasdfghjklzxcvbnm";
    // b.设置字体的大小
    gp.setFont(new Font("微软雅黑", Font.BOLD, 25));
    // c.随机产生四个字符
    for (int i = 1; i <= 4; i++) {
        // 只要产生的随机下标不超过str字符串的长度即可
        int ran_index = ran.nextInt(str.length());
        // str.charAt(ran_index) 获取随机下标返回的字符
        // String.valueOf 将字符转换字符串类型(方便处理)
        String temp = String.valueOf(str.charAt(ran_index));
        // 循环拼接四个字符
        codes += temp;
        // d.产生一个字符就写入(画在画板上)一个字符
        // 颜色随机产生,三原色的取值范围0-255
        int r = ran.nextInt(256);
        int g = ran.nextInt(256);
        int b = ran.nextInt(256);
        // 通过三个不同颜色,产生一个新的颜色画笔
        gp.setColor(new Color(r, g, b));
        // 将字符画在面板上
        gp.drawString(temp, i * 13, 22);
    }

    for (int i = 1; i <= 8; i++) {
        // 颜色随机产生,三原色的取值范围0-255
        int r = ran.nextInt(256);
        int g = ran.nextInt(256);
        int b = ran.nextInt(256);
        // 通过三个不同颜色,产生一个新的颜色画笔
        gp.setColor(new Color(r, g, b));
        // 画入画板上
        gp.drawLine(ran.nextInt(width), ran.nextInt(height), ran
                .nextInt(width), ran.nextInt(height));
    }

    //****************************将完整的验证码放入session****************************
    System.out.println("产生的验证码 : "+codes);
    HttpSession session = req.getSession();
    session.setAttribute("codes", codes);

    // 服务器响应字节流
    ServletOutputStream os = resp.getOutputStream();
    // 写图片流(画板,文件类型,字节流)
    ImageIO.write(bi, "jpg", os);
}

}

jsp页面

<body>
		<form action="LoginServlet" method="post">
			<table width="330px" border="0">
				<tr>
					<td class="txt_right">
						用户名 :
					</td>
					<td>
						<input type="text" name="name" />
					</td>
					<td></td>
				</tr>
				<tr>
					<td class="txt_right">
						密码 :
					</td>
					<td>
						<input type="password" name="pwd" />
					</td>
					<td></td>
				</tr>
				<tr>
					<td class="txt_right">
						验证码 :
					</td>
					<td>
						<input type="text" name="code" />
					</td>
					<td>
						<!-- 图片src直接填入一个servlet,该servlet会响应一张图片response -->
						<img src="CodeServlet" onclick="change_img(this)" style="cursor: pointer;"/>
					</td>
				</tr>
				<tr>
					<td></td>
					<td colspan="2"  style="color: red"><!-- 错误提示 -->
						<input type="submit" value="登录" /> ${msg}
					</td>
					
				</tr>
			</table>
		</form>
		<script type="text/javascript">
			function change_img(t){
				//缓存导致src的改变没有效果,它认为此方法的CodeServlet和原src="CodeServlet"是同一个
				//欺骗浏览器,让每一次src的路径都不同,因为new Date().getTime();会让每次产生的时间都不同
				t.src="CodeServlet?xxx="+new Date().getTime();
			}
		</script>
	</body>

另外需要导入
standard.jar包,验证码注释又不懂的加我微信15717500810沟通交流

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值