Java中使用图片验证码


一、第一种方式

  1. 工具类
@WebServlet("/BufferImage")
public class BufferImage extends HttpServlet {public static final int WIDTH = 120;//生成图片的宽度public static final int HEIGHT = 30;//生成图片的高度public static final int WORDS_NUMBER = 4;//验证码中字符的个数@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubthis.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");// TODO Auto-generated method stubString createTypeFlag = req.getParameter("createTypeFlag");//接收客户端传递的createTypeFlag标识//在内存中创建一张图片BufferedImage bi = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_3BYTE_BGR);//得到图片Graphics g = bi.getGraphics();//设置图片的背景色setBackGround(g);//设置图片的边框setBorder(g);//在图片上画干扰线drawRandomLine(g);//在图片上放上随机字符String randomString = this.drawRandomNum((Graphics2D)g, createTypeFlag);System.out.println(randomString);//将随机数存在session中req.getSession().setAttribute("checkcode", randomString);//设置响应头通知浏览器以图片的形式打开resp.setContentType("image/jpeg");//设置响应头控制浏览器不要缓存resp.setDateHeader("expries", -1);resp.setHeader("Cache-Control", "no-cache");resp.setHeader("Pragma", "no-cache");//将图片传给浏览器ImageIO.write(bi, "jpg", resp.getOutputStream());}//设置图片背景色//@param gprivate void setBackGround(Graphics g) {//设置颜色g.setColor(Color.WHITE);//填充区域g.fillRect(0, 0, WIDTH, HEIGHT);}/** 设置图片的边框* @param g* */private void setBorder(Graphics g) {//设置边框颜色g.setColor(Color.BLUE);//边框区域g.drawRect(1, 1, WIDTH - 2, HEIGHT -2);}/** 在图片上画随机线条 * @param g* */private void drawRandomLine(Graphics g) {//设置颜色g.setColor(Color.GREEN);//设置线条个数并画线for ( int i = 0 ; i < 7 ; i++ ) {int x1 = new Random().nextInt(WIDTH);int y1 = new Random().nextInt(HEIGHT);int x2 = new Random().nextInt(WIDTH);int y2 = new Random().nextInt(HEIGHT);g.drawLine(x1, y1, x2, y2);}}/** 在图片上画随机字符* @param g* @param createTypeFlag* @return String* */private String drawRandomNum(Graphics g,String createTypeFlag) {//设置颜色g.setColor(Color.BLUE);g.setFont(new Font("宋体",Font.BOLD,20));//数字字母的组合String baseNumLetter = "0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ";String baseNum = "0123456789";String baseLetter = "ABCDEFGHJKLMNOPQRSTUVWXYZ";if ( createTypeFlag != null  && createTypeFlag.length() > 0 ) {if( createTypeFlag.equals("nl") ) {//截取数字和字母的组合return createRandomChar((Graphics2D) g,baseNumLetter);} else if ( createTypeFlag.equals("n") ) {//截取数字的组合return createRandomChar((Graphics2D) g,baseNum);} else if ( createTypeFlag.equals("l") ) {//截取字母的组合return createRandomChar((Graphics2D) g,baseLetter);}} else {//截取数字和字母的组合return createRandomChar((Graphics2D) g,baseNumLetter);}return "";}/** 创建随机字符* @param g* @param baseChar* @return String* */private String createRandomChar(Graphics2D g , String baseChar) {StringBuffer b = new StringBuffer();int x = 5;String ch = "";for ( int i = 0 ; i < WORDS_NUMBER ; i++ ) {//设置字体的旋转角度int degree = new Random().nextInt() % 30;ch = baseChar.charAt(new Random().nextInt(baseChar.length())) + "";b.append(ch);//正向角度g.rotate(degree  * Math.PI / 180 , x,20);g.drawString(ch, x, 20);//反向角度g.rotate(-degree  * Math.PI / 180 , x,20);x+=30;}return b.toString();}
}
  1. 后端
    @RequestMapping(value="/userLogin.do")public void userLogin(String code,HttpSession session){String cht=(String)session.getAttribute("checkcode");if(code.equalsIgnoreCase(cht)){System.out.println("验证码正确");}}
  1. 前端
<form>
<img src="BufferImage" οnclick="this.src='BufferImage?'+new Date().getTime()">看不清换一张<br><br>
验证码: <input type="text" id="verify" class="input-medium" placeholder="验证码">
<input type="submit" value="提交">
</form>

二、第二种方式(Spring Boot框架使用)

  1. 工具类
package com.zhiyou.util;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;public final class BufferImage {// 验证码字符集private static final char[] chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N','O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};// 字符数量private static final int SIZE = 4;// 干扰线数量private static final int LINES = 8;// 宽度private static final int WIDTH = 100;// 高度private static final int HEIGHT = 32;// 字体大小private static final int FONT_SIZE = 25;/*** 生成随机验证码及图片* 数组中[验证码,图片]*/public static Object[] createImage() {StringBuffer sb = new StringBuffer();// 1.创建空白图片BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);// 2.获取图片画笔Graphics graphic = image.getGraphics();// 3.设置画笔颜色graphic.setColor(new Color(216, 172, 203, 241));// 4.绘制矩形背景graphic.fillRect(0, 0, WIDTH, HEIGHT);// 5.画随机字符Random ran = new Random();for (int i = 0; i <SIZE; i++) {// 取随机字符索引int n = ran.nextInt(chars.length);// 设置随机颜色graphic.setColor(getRandomColor());// 设置字体大小graphic.setFont(new Font(null, Font.BOLD + Font.ITALIC, FONT_SIZE));// 画字符graphic.drawString(chars[n] + "", i * WIDTH / SIZE, HEIGHT/2+HEIGHT/8);// 记录字符sb.append(chars[n]);}// 6.画干扰线for (int i = 0; i < LINES; i++) {graphic.setColor(getRandomColor());// 随机画线graphic.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT),ran.nextInt(WIDTH), ran.nextInt(HEIGHT));}// 7.返回验证码和图片return new Object[]{sb.toString(), image};}/*** 随机取色*/public static Color getRandomColor() {Random ran = new Random();Color color = new Color(ran.nextInt(256),ran.nextInt(256), ran.nextInt(256));return color;}public static void main(String[] args) throws IOException {Object[] objs = createImage();BufferedImage image = (BufferedImage) objs[1];OutputStream os = new FileOutputStream("src/main/resources/static/picture/eb1ccd3d99794795bc99553b0b762e73.gif");ImageIO.write(image, "png", os);os.close();}}
  1. 后台controller
/* **********************************图片验证码************************************* */@RequestMapping(value = "/BufferImage")protected void createImg(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {//1.生成随机的验证码及图片Object[] objs = BufferImage.createImage();//2.将验证码存入sessionString imgcode = (String) objs[0];HttpSession session = req.getSession();session.setAttribute("checkcode", imgcode);//3.将图片输出给浏览器BufferedImage img = (BufferedImage) objs[1];res.setContentType("image/png");//服务器自动创建输出流,目标指向浏览器OutputStream os = res.getOutputStream();ImageIO.write(img, "png", os);os.close();}
  1. 验证和前台方式不变

Java中使用图片验证码 --菜鸟小回相关推荐

  1. 《XP、面具框架玩机》小米手机玩机教程--菜鸟小回

    <框架玩机>小米手机玩机教程 注:刷机有风险,玩机需谨慎. 操作不当所造成后果与菜鸟小回无关!!! 今天来分享小米手机玩机技巧,Magisk面具+Xp框架! 可能你多上面的名词还有些陌生. ...

  2. java中把gui插入图片_在java中使用图片实现gui的美化.pdf

    在java中使用图片实现gui的美化.pdf 还剩 3页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 图形图像处理GRAPHICS AND IMAGE ...

  3. Java 中代码优化的 30 个小技巧(中)

    11 位运算效率更高 如果你读过 JDK 的源码,比如 ThreadLocal.HashMap 等类,你就会发现,它们的底层都用了位运算. 为什么开发 JDK 的大神们,都喜欢用位运算? 答:因为位运 ...

  4. Java 中代码优化的 30 个小技巧(下)

    21 防止死循环 有些小伙伴看到这个标题,可能会感到有点意外,代码中不是应该避免死循环吗?为啥还是会产生死循环? 殊不知有些死循环是我们自己写的,例如下面这段代码: while(true) {if(c ...

  5. java中关于图片的操作

    java中操作图片 一,给图片加上生成好的二维码及文字 一,给图片加上生成好的二维码及文字 //zxingImage 生成好的二维码 backgroundPath 模板文件的地址 public sta ...

  6. 聊聊我们Java中代码优化的30个小技巧

    今天我们一起聊聊Java中代码优化的30个小技巧,希望会对你有所帮助. 1.用String.format拼接字符串 不知道你有没有拼接过字符串,特别是那种有多个参数,字符串比较长的情况. 比如现在有个 ...

  7. 【Java工具类】(10)—java中给图片添加水印

    Java工具类(10)-java中给图片添加水印 1.工具类 package util;import javax.imageio.ImageIO; import java.awt.*; import ...

  8. Java中实现图片格式的转换

    小小的代码片段,在Java中实现图片格式的转换. 下边的示例中,使用了jpg->jpg,^_^我懒得修改了再测试了,我在实际使用的时候是从bitmap位图转换为了jpg. package com ...

  9. Java中代码优化的30个小技巧

    1.用String.format拼接字符串 String.format方法拼接url请求参数,日志打印等字符串. 但不建议在for循环中用它拼接字符串,因为它的执行效率,比使用+号拼接字符串,或者使用 ...

最新文章

  1. 织梦内容管理系统修改
  2. 技术图文:C#语言中的泛型 I
  3. Python生物信息学②从PDB文件中提取蛋白序列
  4. ACID+CAP+BASE+Transaction(事务)
  5. Java性能问题定位
  6. ES5新增对象的属性和方法
  7. linux集群系列(4) --- LVS之负载均衡集群 --- 持久连接
  8. org.hibernate.InvalidMappingException: Could not parse mapping document from resource
  9. 信息学奥赛C++语言:摘李子
  10. shopxo二次开发:商品管理添加、商品导入库存、设置库存量(教程)
  11. 修改线程的名称 java 1615387415
  12. 向量距离汇总(连续值与离散值),Latex与Python实现
  13. oracle9i 查询scn,在oracle10g 10.2.0.1上测试不完全恢复_recover database until scn
  14. RAC 中 ASM 实例名 与 节点的对应关系
  15. jdbc ?占位符不起作用_JDBC高级(二):DbUtils
  16. Java:处理PDF
  17. 一图理解ceil和floor的区别
  18. GIS制图人员的自我修养(1)--制图误区
  19. Postgresql 配置远程访问
  20. 负反馈放大电路中自激振荡消除方法

热门文章

  1. VS2019离线安装包下载方法
  2. 一些常用的mysql语句实例-以后照写2
  3. 华为路由器配置命令汇总
  4. logstash 数据重复问题
  5. dp:股票系列I II III IV 含冷冻期 含手续费
  6. 图书管理系统接口文档
  7. 手把手带你玩转 Ubuntu,你学废了么?
  8. FFmpeg从入门到入魔(2):保存流到本地MP4
  9. 计算机桌面所有的图标突然不见了怎么办,桌面上图标都不见了怎么办
  10. 微信小程序地理位置API使用流程