2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 生成验证码图片的Java代码

生成验证码图片的Java代码

时间:2021-06-14 04:41:58

相关推荐

生成验证码图片的Java代码

文章目录

验证码演示代码请求资源路径为什么要添加一个随机数的参数

验证码演示代码

package priv.lwx.javaex.servlet_demo.web.servlet.response;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.awt.*;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;/*** 验证码示例代码** @author liaowenxiong* @date /1/10 11:01*/@WebServlet("/check_code")public class CheckCodeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {int width = 100; // 表示图片的宽度,单位像素int height = 50; // 表示图片的高度,单位像素// 1.创建一个图片对象,代表内存中的验证码图片。图片对象创建好之后,就表示在内存中创建了一个图片(内存中存储的是二进制数据),图片背景色默认黑色BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);// 2.美化图片// 2.1.填充背景色// 先获取画笔Graphics graphics = image.getGraphics();// 设置画笔的颜色为粉红色graphics.setColor(Color.PINK);// 填充矩形graphics.fillRect(0, 0, width, height);// 2.2.画边框// 设置画笔的颜色为蓝色graphics.setColor(Color.BLUE);// 画边框graphics.drawRect(0, 0, -1, height - 1);// 画随机字符// 随机字符的来源String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";// 创建随机数对象Random ran = new Random();// 2.3.画随机字符。循环四次,画4个随机的字符for (int i = 1; i <= 4; i++) {// 生成随机的字符串下标int index = ran.nextInt(str.length());// 获取随机字符char c = str.charAt(index);// 画随机字符graphics.drawString(c + "", width / 5 * i, height / 2);}// 2.4.画干扰线// 设置画笔的颜色为绿色的graphics.setColor(Color.GREEN);// 获取随机的for (int i = 0; i < 10; i++) {// 获取两个随机点的坐标值int x1 = ran.nextInt(width);int x2 = ran.nextInt(width);int y1 = ran.nextInt(height);int y2 = ran.nextInt(height);// 画线graphics.drawLine(x1, y1, x2, y2);}// 3.将图片输出到Response对象的字节流中ImageIO.write(image, "jpg", resp.getOutputStream());}}

请求资源路径为什么要添加一个随机数的参数

由于浏览器的缓存机制,发送的请求资源路径如果与上一次相同,有的浏览器不会再向服务器发送请求。

解决方案:

采用一种“欺骗”手段向服务发送请求。就是给请求资源路径增加一个参数,参数值是一个随机数,那么就可以制造假象,使得每次发送的请求地址不同。其实服务器端的 Servlet 每次处理请求时,并没有用到该参数,只是为了给浏览器制造假象罢了。

例如:

img.src="/servlet_demo/check_code?" + Math.random();

或者

img.src = "/servlet_demo/check_code?" + date;

前端示例代码:

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>注册界面</title><script>window.onload = function () {var img = document.getElementById("checkCode");var link = document.getElementById("changeCode");// 给图片元素注册点击事件监听器img.onclick = function () {var date = new Date().getTime();img.src = "/servlet_demo/check_code?" + date;}// 给超链接注册点击事件监听器link.onclick = function () {var date = new Date().getTime();img.src = "/servlet_demo/check_code?" + date;}}</script></head><body><form action="/servlet_demo/request-demo06" method="get"><input type="text" placeholder="请输入用户名" name="userName"/><br><input type="text" placeholder="请输入密码" name="password"/><br><input type="text" placeholder="请输入验证码" name="checkCode"/><img id="checkCode" src="/servlet_demo/check_code"/><a id="changeCode" href="javascript:void(0);">看不清楚换一张?</a><br><input type="submit" value="提交"/></form></body></html>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。