Java实现的生成二维码统计扫描次数并转发到某个地址功能详解
程序员文章站
2024-02-14 17:40:04
本文实例讲述了java实现的生成二维码统计扫描次数并转发到某个地址功能。分享给大家供大家参考,具体如下:
需求:
近几天某个项目需要用户录入个自己的网址,然后系统需要根...
本文实例讲述了java实现的生成二维码统计扫描次数并转发到某个地址功能。分享给大家供大家参考,具体如下:
需求:
近几天某个项目需要用户录入个自己的网址,然后系统需要根据用户的的网址生成二维码,然后用户可以拿着它给别人扫描,访问到他录入的网址,在这个过程中.我需要知道用户的二维码被扫描的次数,也就是后面根据其可以做一些扫描排名之类的.
思路:
① 先生成二维码,csdn已经有前辈写了,那么我就直接拿过来用了.
② 将用户的id,和用户录入的网址处理之后作为http get参数封装到二维码中,然后用户扫描会自动跳转到我们系统的某个接口
③ 在接口中根据用户id将用户查询出来,扫描次数加1后重定向到用户录入页面
代码实现:
1. 生成二维码部分,引用了前辈的成果,点个赞,用起来感觉不错!
package javacommon.qrcode; import java.awt.color; import java.awt.graphics2d; import java.awt.image.bufferedimage; import java.io.file; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import java.io.unsupportedencodingexception; import javax.imageio.imageio; import org.junit.test; import jp.sourceforge.qrcode.qrcodedecoder; import jp.sourceforge.qrcode.exception.decodingfailedexception; import com.swetake.util.qrcode; /** * 创建二维码工具类,将类改成了静态工具类 * @author bill * @see 源来自: https://www.jb51.net/article/89996.htm * @since v1.0 2014/01/07 */ public class twodimensioncode { /*private twodimensioncode() { }*/ /** * 生成二维码(qrcode)图片 * @param content 存储内容 * @param imgpath 图片路径 */ public static void encoderqrcode(string content, string imgpath) { encoderqrcode(content, imgpath, "png", 7); } /** * 生成二维码(qrcode)图片 * @param content 存储内容 * @param output 输出流 */ public static void encoderqrcode(string content, outputstream output) { encoderqrcode(content, output, "png", 7); } /** * 生成二维码(qrcode)图片 * @param content 存储内容 * @param imgpath 图片路径 * @param imgtype 图片类型 */ public static void encoderqrcode(string content, string imgpath, string imgtype) { encoderqrcode(content, imgpath, imgtype, 7); } /** * 生成二维码(qrcode)图片 * @param content 存储内容 * @param output 输出流 * @param imgtype 图片类型 */ public static void encoderqrcode(string content, outputstream output, string imgtype) { encoderqrcode(content, output, imgtype, 7); } /** * 生成二维码(qrcode)图片 * @param content 存储内容 * @param imgpath 图片路径 * @param imgtype 图片类型 * @param size 二维码尺寸 */ public static void encoderqrcode(string content, string imgpath, string imgtype, int size) { try { bufferedimage bufimg = qrcodecommon(content, imgtype, size); file imgfile = new file(imgpath); // 生成二维码qrcode图片 imageio.write(bufimg, imgtype, imgfile); } catch (exception e) { e.printstacktrace(); } } /** * 生成二维码(qrcode)图片 * @param content 存储内容 * @param output 输出流 * @param imgtype 图片类型 * @param size 二维码尺寸 */ public static void encoderqrcode(string content, outputstream output, string imgtype, int size) { try { bufferedimage bufimg = qrcodecommon(content, imgtype, size); // 生成二维码qrcode图片 imageio.write(bufimg, imgtype, output); } catch (exception e) { e.printstacktrace(); } } /** * 生成二维码(qrcode)图片的公共方法 * @param content 存储内容 * @param imgtype 图片类型 * @param size 二维码尺寸 取值范围1-40,值越大尺寸越大,可存储的信息越大 * @return */ private static bufferedimage qrcodecommon(string content, string imgtype, int size) { bufferedimage bufimg = null; try { qrcode qrcodehandler = new qrcode(); // 设置二维码排错率,可选l(7%)、m(15%)、q(25%)、h(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小 qrcodehandler.setqrcodeerrorcorrect('m'); qrcodehandler.setqrcodeencodemode('b'); // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大 qrcodehandler.setqrcodeversion(size); // 获得内容的字节数组,设置编码格式 byte[] contentbytes = content.getbytes("utf-8"); // 图片尺寸 int imgsize = 67 + 12 * (size - 1); bufimg = new bufferedimage(imgsize, imgsize, bufferedimage.type_int_rgb); graphics2d gs = bufimg.creategraphics(); // 设置背景颜色 gs.setbackground(color.white); gs.clearrect(0, 0, imgsize, imgsize); // 设定图像颜色> black gs.setcolor(color.black); // 设置偏移量,不设置可能导致解析出错 int pixoff = 2; // 输出内容> 二维码 if (contentbytes.length > 0 && contentbytes.length < 800) { boolean[][] codeout = qrcodehandler.calqrcode(contentbytes); for (int i = 0; i < codeout.length; i++) { for (int j = 0; j < codeout.length; j++) { if (codeout[j][i]) { gs.fillrect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); } } } } else { throw new exception("qrcode content bytes length = " + contentbytes.length + " not in [0, 800]."); } gs.dispose(); bufimg.flush(); } catch (exception e) { e.printstacktrace(); } return bufimg; } /** * 解析二维码(qrcode) * @param imgpath 图片路径 * @return */ public static string decoderqrcode(string imgpath) { // qrcode 二维码图片的文件 file imagefile = new file(imgpath); bufferedimage bufimg = null; string content = null; try { bufimg = imageio.read(imagefile); qrcodedecoder decoder = new qrcodedecoder(); content = new string(decoder.decode(new twodimensioncodeimage(bufimg)), "utf-8"); } catch (ioexception e) { system.out.println("error: " + e.getmessage()); e.printstacktrace(); } catch (decodingfailedexception dfe) { system.out.println("error: " + dfe.getmessage()); dfe.printstacktrace(); } return content; } /** * 解析二维码(qrcode) * @param input 输入流 * @return */ public static string decoderqrcode(inputstream input) { bufferedimage bufimg = null; string content = null; try { bufimg = imageio.read(input); qrcodedecoder decoder = new qrcodedecoder(); content = new string(decoder.decode(new twodimensioncodeimage(bufimg)), "utf-8"); } catch (ioexception e) { system.out.println("error: " + e.getmessage()); e.printstacktrace(); } catch (decodingfailedexception dfe) { system.out.println("error: " + dfe.getmessage()); dfe.printstacktrace(); } return content; } public static void main(string[] args) { string imgpath = "e:/01.png"; //string encodercontent = "hello 大大、小小,welcome to qrcode!" + "\nmyblog [ http://sjsky.iteye.com ]" + "\nemail [ sjsky007@gmail.com ]"; twodimensioncode handler = new twodimensioncode(); //handler.encoderqrcode(encodercontent, imgpath, "png"); // try { // outputstream output = new fileoutputstream(imgpath); // handler.encoderqrcode(content, output); // } catch (exception e) { // e.printstacktrace(); // } // system.out.println("========encoder success"); string decodercontent = handler.decoderqrcode(imgpath); system.out.println("解析结果如下:"); system.out.println(decodercontent); system.out.println("========decoder success!!!"); } @test public void test01() throws unsupportedencodingexception{ string msg = "http://baike.baidu.com/link?yvwkhk4xqvwk444yx444yxzxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5zxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhk4n4azgwu6z5smy35syxzxqmyvwkhkikmbrht9-s2wbaebs哈哈哪里拉萨的"; system.out.println("normal:"+msg.length()); system.out.println("bytes:"+msg.getbytes("utf-8").length); encoderqrcode(msg.tostring(),"e:/2/t7.png", "png", 40); system.out.println("ok"); } } package javacommon.qrcode; import java.awt.image.bufferedimage; import jp.sourceforge.qrcode.data.qrcodeimage; public class twodimensioncodeimage implements qrcodeimage { bufferedimage bufimg; public twodimensioncodeimage(bufferedimage bufimg) { this.bufimg = bufimg; } @override public int getheight() { return bufimg.getheight(); } @override public int getpixel(int x, int y) { return bufimg.getrgb(x, y); } @override public int getwidth() { return bufimg.getwidth(); } }
还有个jar包,点击此处本站下载。
2. 生成二维码并且提供外网访问地址方法
/** * 根据用户给的地址,生成一个二维码,并存放到本地. 返回出外网访问地址 * @param qrcodetargeturl 用户传入的地址 * @param campaign 活动编号 * @return * @throws unsupportedencodingexception */ private string generator2code(string qrcodetargeturl,campaign campaign) throws unsupportedencodingexception { // todo 实现二维码创建 if(!stringutils.isempty(qrcodetargeturl)){ string httpurl = appconfig.getproperty("filevisiturl"); string localurl = appconfig.getproperty("uploadfilebasepath"); // 文件名 stringbuilder userofurl = new stringbuilder("qrcode/"); userofurl.append(campaign.getuser().getemail() + "/"); userofurl.append(campaign.get_id() + "/"); new file(localurl + userofurl).mkdirs(); // 创建文件夹 userofurl.append("qrcode.png"); // 生成扫描地址 stringbuilder qrcodescannerurl = new stringbuilder(); { qrcodescannerurl.append(appconfig.getproperty("qrcodescannerurl")); qrcodescannerurl.append("t="+urlencoder.encode(qrcodetargeturl, "utf-8")); qrcodescannerurl.append("&i="+campaign.get_id()); } long targeturllength = qrcodescannerurl.tostring().getbytes("utf-8").length; int qrcodesize = 0; // 控制生成的二维码大小 if(targeturllength <= 120 ){ // 7 qrcodesize = 7; }else if(targeturllength <= 410){ // 15 qrcodesize = 15; }else{ qrcodesize = 20; // 这里最大20已经能满足需要了,最大可以设置为40 } twodimensioncode.encoderqrcode( qrcodescannerurl.tostring(), localurl + userofurl, "png", qrcodesize); return httpurl + userofurl; } return stringutils.empty; }
3. 扫描生成的所有的二维码会访问的接口,在这里进行扫描统计.
/** * 文件名:qrcodecontroller.java * 版权:copyright 2014-2015 buyantech.all rights reserved. * 描述: 负责累加广告的扫描次数 * 修改人:bill * 修改时间:2014/01/07 * 修改内容: 无 */package com.buyantech.campaign.controller; import java.io.ioexception; import javacommon.base.basespringcontroller; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.apache.commons.lang.stringutils; import org.apache.log4j.logger; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.controller; import com.buyantech.campaign.model.campaign; import com.buyantech.campaign.service.campaignmanager; import com.buyantech.campaign.util.appconfig; /** * 负责累加广告的扫描次数 * @author bill * @since v1.0 2014/01/07 */ @controller public class qrcodecontroller extends basespringcontroller { @autowired private campaignmanager campaignmanager; logger logger = logger.getlogger(qrcodecontroller.class); /** * 用作增加广告二维码扫描次数,和转发 * @param request * @param response * @throws ioexception */ public void q(httpservletrequest request,httpservletresponse response) throws ioexception{ string targeturl = request.getparameter("t"); // targerurl : 目标地址 string camid = request.getparameter("i"); // camid : 广告编号 boolean isaddsuccess = false; int scannersize = -1; if(!stringutils.isempty(camid)){ campaign campaign = campaignmanager.findbyid(camid); if (campaign != null) { scannersize = campaign.getqrcodescancount() + 1; campaign.setqrcodescancount(scannersize); isaddsuccess = true; campaignmanager.save(campaign); } } // 判断是否累加成功 if(!isaddsuccess){ logger.error("用户扫描目标二维码地址为:"+targeturl+",扫描累加记录失败!"); }else{ logger.info("广告编号:"+camid+"被扫描,当前累积次数为:"+scannersize); } // 判断是否携带地址,理论上是不存在地址为空的.可能被hacker恶意修改,友好提示! if(!stringutils.isempty(targeturl)){ response.sendredirect(targeturl); }else{ response.getwriter().print("<h3>tips:感谢您扫描本次二维码,地址已经失效了,欢迎您访问:<a href=\""+appconfig.getproperty("serverurl")+"\">物联网广告平台</a></h3>"); } } }
好的,到这里就差不多了.
ps:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
在线生成二维码工具(加强版)
在线二维码解码识别工具
更多关于java相关内容感兴趣的读者可查看本站专题:《java编码操作技巧总结》、《java数学运算技巧总结》、《java数据结构与算法教程》、《java字符与字符串操作技巧总结》、《java操作dom节点技巧总结》和《java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
下一篇: java实现简单TCP聊天程序