controller:

 /**
* 获取登录的验证码
* @param request
* @param response
*/
public void getLoginCode(HttpSession session,HttpServletRequest request,
HttpServletResponse response) throws Exception{
// 获取验证码以及图片
Map<String,Object> map = CodeUtil.generateCodeAndPic();
// 将验证码存入Session
session.setAttribute("imageCode",map.get("code"));
// 获取图片
BufferedImage image = (BufferedImage) map.get("codePic");
// 转成base64
BASE64Encoder encoder = new BASE64Encoder();
ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流
ImageIO.write(image, "png", baos);//写入流中
byte[] bytes = baos.toByteArray();//转换成字节
String png_base64 = encoder.encodeBuffer(bytes).trim();//转换成base64串
//删除 \r\n
png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");
Map<String,String> maps = new HashMap<>();
maps.put("code","" + map.get("code"));
maps.put("address",png_base64);
JSONObject jsonObject = JSONObject.fromObject(maps);
PrintWriter writer = response.getWriter();
writer.print(jsonObject);
writer.flush();
writer.close();
}

private static int width = 180;
private static int height = 40;
private static int codeCount = 4;
private static int xx = 30;
private static int fontHeight = 36;
private static int codeY = 32;
private static char[] codeSequence = {
'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', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
}; /**
* 生成验证码图片
* @return
*/
public static Map<String,Object> generateCodeAndPic(){
//定义图像buffer
BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics graphics = bufferedImage.getGraphics();
//创建一个随机数类
Random random = new Random();
// 将图像填充为白色
graphics.setColor(Color.WHITE);
// 填充图像
graphics.fillRect(0,0,width,height);
// 创建字体,字体的大小应该根据图片的高度来定
Font font = new Font("Fixedsys", Font.BOLD, fontHeight);
// 设置字体
graphics.setFont(font);
// 画边框
graphics.setColor(Color.black);
graphics.drawRect(0,0,width-1,height-1);
// 随机产生30条干扰线,让图形码不便于被其他程序检测到
graphics.setColor(Color.black);
for (int i=0;i<30;i++){
int x = random.nextInt(width);
int y = random.nextInt(height);
int x1 = random.nextInt(12);
int y1 = random.nextInt(12);
graphics.drawLine(x,y,x + x1,y + y1);
}
// randomCode用于保存随机生成的二维码,便于用户登录时验证
StringBuffer randomCode = new StringBuffer();
int red = 0, green=0,blue = 0; // 随机产生codeCount数字的验证码
for (int i =0;i<codeCount;i++){
// 得到随机的验证码数字
String code = String.valueOf(codeSequence[random.nextInt(36)]);
// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色都不一样
red = random.nextInt(255);
blue = random.nextInt(255);
green = random.nextInt(255); // 用随机产生的颜色将验证码放到图像中
graphics.setColor(new Color(red,green,blue));
graphics.drawString(code,(i + 1) * xx,codeY); // 将产生的四个随机数组合在一起
randomCode.append(code);
} Map<String,Object> map = new HashMap<>();
// 存放验证码
map.put("code",randomCode);
// 存放生成的验证码BufferedImage对象
map.put("codePic",bufferedImage);
return map;
}

java后台生成图片二维码的更多相关文章

  1. Java 验证码、二维码

    Java 验证码.二维码 资源 需要:   jelly-core-1.7.0.GA.jar网站:   http://lychie.github.io/products.html将下载下来的 jelly ...

  2. 在java中生成二维码,并直接输出到jsp页面

    在java中生成的二维码不存到磁盘里要直接输出到页面上,这就需要把生成的二维码直接以流的形式输出到页面上,我用的是myeclipse 和 tomcat 它的原理是:在加载页面时,根据img的src(c ...

  3. java代码解析二维码

    java代码解析二维码一般步骤 本文采用的是google的zxing技术进行解析二维码技术,解析二维码的一般步骤如下: 一.下载zxing-core的jar包: 二.创建一个BufferedImage ...

  4. Java生成艺术二维码也可以很简单

    原文点击: Quick-Media Java生成艺术二维码也可以很简单 现在二维码可以说非常常见了,当然我们见得多的一般是白底黑块,有的再中间加一个 logo,或者将二维码嵌在一张特定的背景中(比如微 ...

  5. Java生成微信二维码及logo二维码

    依赖jar包 二维码的实现有多种方法,比如 Google 的 zxing 和日本公司的 QrCode,本文以 QrCode 为例. QrCode.jar:https://pan.baidu.com/s ...

  6. java画海报二维码

    package cn.com.yitong.ares.qrcode; import java.awt.BasicStroke;import java.awt.Color;import java.awt ...

  7. java springMVC生成二维码

    Zxing是Google提供的工具,提供了二维码的生成与解析的方法,现在使用Java利用Zxing生成二维码 1),二维码的生成 将Zxing-core.jar 包加入到classpath下. 我的下 ...

  8. java生成/解析二维码

    package a; import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; import ...

  9. java实现生成二维码

    package com.cn.test; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.a ...

随机推荐

  1. js 时间戳 中国标准时间 年月日 日期之间的转换

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. HDU 5289 Assignment [优先队列 贪心]

    HDU 5289 - Assignment http://acm.hdu.edu.cn/showproblem.php?pid=5289 Tom owns a company and he is th ...

  3. NOI 2018 归程 (Kruskal重构树)

    题目大意:太长了,略 Kruskal重构树,很神奇的一个算法吧 如果两个并查集被某种条件合并,那么这个条件作为一个新的节点连接两个并查集 那么在接下来的提问中,如果某个点合法,它的所有子节点也都合法, ...

  4. Java获取当天、本周、本月、本季度、本年等 开始及结束时间

    package com.zhaochao.utils; import java.text.SimpleDateFormat; import java.util.Calendar; import jav ...

  5. 前端和后台对接时对sign加密方法

    前端和后台对接时对sign加密方法 /*后台php对接进行sign标签加密 1 获取向后台请求的数据data(key/value方式),可以是个对象(obj),也可以是数组(arr); 2 将数据的k ...

  6. Android px,dp,pt,sp的差别

    px(像素点) mm 等Android不建议用 为什么电脑web开发能够用而Android不建议用? 由于px代表像素点个数,一般电脑分辨率都同样 不管14寸还是15寸都是1366*768而手机分辨率 ...

  7. javase复习

    一.总结封装 封装就是将数据和操作数据的方法绑定起来,通过private修饰数据,这样对数据的访问只能通过定义的操作数据的方法get/set来操作数据. 封装优点:1.由于将数据进行了封装,隐藏了不必 ...

  8. IOS 数据存储之 SQLite具体解释

    在IOS开发中常常会须要存储数据,对于比較少量的数据能够採取文件的形式存储,比方使用plist文件.归档等,可是对于大量的数据,就须要使用数据库,在IOS开发中数据库存储能够直接通过SQL訪问数据库, ...

  9. iOS开发之十万个为什么&lt;1&gt;

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...

  10. CDOJ 876 爱管闲事 DP

    爱管闲事 春希非常爱管闲事,他每天都会抽空帮助一些同学,由于春希非常死板,出于公平性,春希不会先帮助后来找他的同学. 现在有n个同学需要他的帮助,虽然他很想一天之类帮助所有人,但毕竟精力有限,于是他决 ...