温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

利用Java实现一个验证码功能

发布时间:2020-11-07 14:49:06 来源:亿速云 阅读:1662 作者:Leah 栏目:开发技术

今天就跟大家聊聊有关利用Java实现一个验证码功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

要导入servlet-api.jar包

创建验证码的Util工具类:

先创建图片并生成随机的验证码字母

利用Java实现一个验证码功能

设置图片的底色,并用setFont函数将验证码画在图片上,如果想让验证码难一点,可以添加for循环的代码给图片增加旋转角度

利用Java实现一个验证码功能

给验证码增加干扰线,提高安全性

利用Java实现一个验证码功能

设置边框

利用Java实现一个验证码功能

创建VerifyPic的servlet,通过Util类获取代码,并存入session中,然后输送去前端页面

利用Java实现一个验证码功能

前端页面验证码如下:

利用Java实现一个验证码功能

完整Util工具类代码如下:

package com.sport.util;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;

public class VerifyUtil {
 public static Map<String, Object> generateVerify(){
  //创建一张图片
  BufferedImage verifyPic = new BufferedImage(120,40,BufferedImage.TYPE_3BYTE_BGR);
  //通过图片获取画笔
  Graphics2D g = verifyPic.createGraphics();
  //准备一个字母+数字的字典
  String letters = "23456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  //规定验证码的位数
  int verifyLength = 4;
  //生成随机验证码
  String verifyCode = "";
  //循环取值
  for(int i=0; i<verifyLength; i++) {
   verifyCode +=letters.charAt((int)(Math.random()*letters.length()));
  }
  //将图片的底板由黑变白
  g.setColor(Color.white);
  g.fillRect(0, 0, 120, 40);
  //将验证码画在图片之上
  g.setFont(new Font("微软雅黑",Font.BOLD, 24));
  for (int i = 0; i < verifyLength; i++) {
   //随机产生一个角度
   double theta = Math.random() * Math.PI / 4 * ((int)(Math.random()*2) == 0&#63;1:-1);
   //产生偏转
   g.rotate(theta, 24+i*22, 20);
   //每画一个字幕之前都随机给一个颜色
   g.setColor(new Color((int)(Math.random()*256), (int)(Math.random()*256), (int)(Math.random()*256)));
   g.drawString(verifyCode.charAt(i)+"", 20+i*22 , 26);
   //回正
   g.rotate(-theta, 24+i*22, 20);
  }
  //加入干扰线
  for (int i = 0; i < 5; i++) {
   //给随机颜色
   g.setColor(new Color((int)(Math.random()*256), (int)(Math.random()*256), (int)(Math.random()*256)));
   //画线
   g.drawLine((int)(Math.random()*120), (int)(Math.random()*40),
     (int)(Math.random()*120), (int)(Math.random()*40));
  }
  //设置边框颜色
  g.setColor(Color.black);
  //给验证码一个外边框
  g.drawRect(0, 0, 118, 38);

  //将验证码和图片一起存入map
  Map<String, Object> data = new HashMap<String, Object>();
  data.put("verifyCode", verifyCode);
  data.put("verifyPic", verifyPic);

  return data;
 }
}

完整VerifyPic的代码如下:

package com.sport.servlet;

import com.sport.util.VerifyUtil;

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 javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Map;

@WebServlet("/VerifyPic")
public class VerifyPic extends HttpServlet {
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  Map<String, Object> data = VerifyUtil.generateVerify();
  //获取验证码
  String verifyCode = (String) data.get("verifyCode");
  //将验证码存入session
  HttpSession session = request.getSession();
  session.setAttribute("verifyCode", verifyCode);
  //获取图片
  BufferedImage verifyPic = (BufferedImage) data.get("verifyPic");
  //输出图片给前端,使用工具类ImageIO
  ImageIO.write(verifyPic, "jpg", response.getOutputStream());

 }

 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doGet(request, response);
 }
}

看完上述内容,你们对利用Java实现一个验证码功能有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI