Java实现的生成二维码统计扫描次数并转发到某个地址功能详解
本文实例讲述了Java实现的生成二维码统计扫描次数并转发到某个地址功能。分享给大家供大家参考,具体如下:
需求:
近几天某个项目需要用户录入个自己的网址,然后系统需要根据用户的的网址生成二维码,然后用户可以拿着它给别人扫描,访问到他录入的网址,在这个过程中.我需要知道用户的二维码被扫描的次数,也就是后面根据其可以做一些扫描排名之类的.
思路:
①先生成二维码,csdn已经有前辈写了,那么我就直接拿过来用了.
②将用户的id,和用户录入的网址处理之后作为httpget参数封装到二维码中,然后用户扫描会自动跳转到我们系统的某个接口
③在接口中根据用户id将用户查询出来,扫描次数加1后重定向到用户录入页面
代码实现:
1.生成二维码部分,引用了前辈的成果,点个赞,用起来感觉不错!
packagejavacommon.qrcode; importjava.awt.Color; importjava.awt.Graphics2D; importjava.awt.image.BufferedImage; importjava.io.File; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; importjava.io.UnsupportedEncodingException; importjavax.imageio.ImageIO; importorg.junit.Test; importjp.sourceforge.qrcode.QRCodeDecoder; importjp.sourceforge.qrcode.exception.DecodingFailedException; importcom.swetake.util.Qrcode; /** *创建二维码工具类,将类改成了静态工具类 *@authorBill *@see源来自:https://www.nhooo.com/article/89996.htm *@sinceV1.02014/01/07 */ publicclassTwoDimensionCode{ /*privateTwoDimensionCode(){ }*/ /** *生成二维码(QRCode)图片 *@paramcontent存储内容 *@paramimgPath图片路径 */ publicstaticvoidencoderQRCode(Stringcontent,StringimgPath){ encoderQRCode(content,imgPath,"png",7); } /** *生成二维码(QRCode)图片 *@paramcontent存储内容 *@paramoutput输出流 */ publicstaticvoidencoderQRCode(Stringcontent,OutputStreamoutput){ encoderQRCode(content,output,"png",7); } /** *生成二维码(QRCode)图片 *@paramcontent存储内容 *@paramimgPath图片路径 *@paramimgType图片类型 */ publicstaticvoidencoderQRCode(Stringcontent,StringimgPath,StringimgType){ encoderQRCode(content,imgPath,imgType,7); } /** *生成二维码(QRCode)图片 *@paramcontent存储内容 *@paramoutput输出流 *@paramimgType图片类型 */ publicstaticvoidencoderQRCode(Stringcontent,OutputStreamoutput,StringimgType){ encoderQRCode(content,output,imgType,7); } /** *生成二维码(QRCode)图片 *@paramcontent存储内容 *@paramimgPath图片路径 *@paramimgType图片类型 *@paramsize二维码尺寸 */ publicstaticvoidencoderQRCode(Stringcontent,StringimgPath,StringimgType,intsize){ try{ BufferedImagebufImg=qRCodeCommon(content,imgType,size); FileimgFile=newFile(imgPath); //生成二维码QRCode图片 ImageIO.write(bufImg,imgType,imgFile); }catch(Exceptione){ e.printStackTrace(); } } /** *生成二维码(QRCode)图片 *@paramcontent存储内容 *@paramoutput输出流 *@paramimgType图片类型 *@paramsize二维码尺寸 */ publicstaticvoidencoderQRCode(Stringcontent,OutputStreamoutput,StringimgType,intsize){ try{ BufferedImagebufImg=qRCodeCommon(content,imgType,size); //生成二维码QRCode图片 ImageIO.write(bufImg,imgType,output); }catch(Exceptione){ e.printStackTrace(); } } /** *生成二维码(QRCode)图片的公共方法 *@paramcontent存储内容 *@paramimgType图片类型 *@paramsize二维码尺寸取值范围1-40,值越大尺寸越大,可存储的信息越大 *@return */ privatestaticBufferedImageqRCodeCommon(Stringcontent,StringimgType,intsize){ BufferedImagebufImg=null; try{ QrcodeqrcodeHandler=newQrcode(); //设置二维码排错率,可选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"); //图片尺寸 intimgSize=67+12*(size-1); bufImg=newBufferedImage(imgSize,imgSize,BufferedImage.TYPE_INT_RGB); Graphics2Dgs=bufImg.createGraphics(); //设置背景颜色 gs.setBackground(Color.WHITE); gs.clearRect(0,0,imgSize,imgSize); //设定图像颜色>BLACK gs.setColor(Color.BLACK); //设置偏移量,不设置可能导致解析出错 intpixoff=2; //输出内容>二维码 if(contentBytes.length>0&&contentBytes.length<800){ boolean[][]codeOut=qrcodeHandler.calQrcode(contentBytes); for(inti=0;i还有个jar包,点击此处本站下载。
2.生成二维码并且提供外网访问地址方法
/** *根据用户给的地址,生成一个二维码,并存放到本地.返回出外网访问地址 *@paramqrCodeTargetUrl用户传入的地址 *@paramcampaign活动编号 *@return *@throwsUnsupportedEncodingException */ privateStringgenerator2Code(StringqrCodeTargetUrl,Campaigncampaign)throwsUnsupportedEncodingException{ //TODO实现二维码创建 if(!StringUtils.isEmpty(qrCodeTargetUrl)){ StringhttpUrl=AppConfig.getProperty("fileVisitUrl"); StringlocalUrl=AppConfig.getProperty("uploadFileBasePath"); //文件名 StringBuilderuserOfUrl=newStringBuilder("qrcode/"); userOfUrl.append(campaign.getUser().getEmail()+"/"); userOfUrl.append(campaign.get_id()+"/"); newFile(localUrl+userOfUrl).mkdirs();//创建文件夹 userOfUrl.append("qrcode.png"); //生成扫描地址 StringBuilderqrcodeScannerUrl=newStringBuilder(); { qrcodeScannerUrl.append(AppConfig.getProperty("qrcodeScannerUrl")); qrcodeScannerUrl.append("t="+URLEncoder.encode(qrCodeTargetUrl,"UTF-8")); qrcodeScannerUrl.append("&i="+campaign.get_id()); } longtargetUrlLength=qrcodeScannerUrl.toString().getBytes("UTF-8").length; intqrcodeSize=0; //控制生成的二维码大小 if(targetUrlLength<=120){//7 qrcodeSize=7; }elseif(targetUrlLength<=410){//15 qrcodeSize=15; }else{ qrcodeSize=20;//这里最大20已经能满足需要了,最大可以设置为40 } TwoDimensionCode.encoderQRCode( qrcodeScannerUrl.toString(), localUrl+userOfUrl, "png", qrcodeSize); returnhttpUrl+userOfUrl; } returnStringUtils.EMPTY; }3.扫描生成的所有的二维码会访问的接口,在这里进行扫描统计.
/** *文件名:QrcodeController.java *版权:Copyright2014-2015BuyanTech.AllRightsReserved. *描述:负责累加广告的扫描次数 *修改人:Bill *修改时间:2014/01/07 *修改内容:无 */packagecom.buyantech.campaign.controller; importjava.io.IOException; importjavacommon.base.BaseSpringController; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.apache.commons.lang.StringUtils; importorg.apache.log4j.Logger; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.stereotype.Controller; importcom.buyantech.campaign.model.Campaign; importcom.buyantech.campaign.service.CampaignManager; importcom.buyantech.campaign.util.AppConfig; /** *负责累加广告的扫描次数 *@authorBill *@sinceV1.02014/01/07 */ @Controller publicclassQrcodeControllerextendsBaseSpringController{ @Autowired privateCampaignManagercampaignManager; Loggerlogger=Logger.getLogger(QrcodeController.class); /** *用作增加广告二维码扫描次数,和转发 *@paramrequest *@paramresponse *@throwsIOException */ publicvoidq(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{ StringtargetUrl=request.getParameter("t");//targerUrl:目标地址 StringcamId=request.getParameter("i");//camId:广告编号 booleanisAddSuccess=false; intscannerSize=-1; if(!StringUtils.isEmpty(camId)){ Campaigncampaign=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("tips:感谢您扫描本次二维码,地址已经失效了,欢迎您访问:
"); } } }物联网广告平台 好的,到这里就差不多了.
PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
在线生成二维码工具(加强版)
http://tools.jb51.net/transcoding/jb51qrcode在线二维码解码识别工具
http://tools.jb51.net/transcoding/trans_qrcode
更多关于java相关内容感兴趣的读者可查看本站专题:《Java编码操作技巧总结》、《Java数学运算技巧总结》、《Java数据结构与算法教程》、《Java字符与字符串操作技巧总结》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。