java实现手机扫描二维码后网站跳转新页面

news/2024/5/14 13:05:36/文章来源:https://cxhzt.blog.csdn.net/article/details/120888956

java实现手机扫描二维码后网站跳转新页面,提供zxing和hutools的方式实现二维码的生成,动态刷新,验证跳转功能。

1.效果图:

二维码设置有效时间

失效重新获取二维码

手机扫描二维码成功后网站跳转新页面

 2.后端代码:

/*** @description 二维码控制器*/
@Controller
public class QrcodeController {@Autowiredprivate RedisUtils redisUtils;/*** @description 二维码页面* @return  java.lang.String**/@GetMapping({"/","/index"})public  String index(ModelMap modelMap){modelMap.put("userId", 1);return "index";}/*** @description 生成二维码* @param  request* @Param  response* @return  void**/@GetMapping("/getQrcode")@ResponseBodypublic void getQrcode(HttpServletRequest request, HttpServletResponse response) throws Exception {//二维码中的链接,需要公网网址才可以用手机扫描出来,本地测试开通natapp进行内网渗透String url = "http://qh22wg.natappfree.cc/scanQrcode";//过期时间,30slong expireTime = 30;//设置参数String random = request.getParameter("random");String userId = request.getParameter("userId");//生成二维码唯一标识String key = String.valueOf(System.currentTimeMillis());//设置二维码过期时间redisUtils.set(key,random,expireTime);//二维码中的内容String content = url + "?key=" + key + "&userId=" + userId;//二维码图片中间logoString imgPath = null;Boolean needCompress = true;//拿到图片流ByteArrayOutputStream out = QRCodeUtil.encodeIO(content, imgPath, needCompress);//返回二维码response.setCharacterEncoding("UTF-8");response.setContentType("image/jpeg;charset=UTF-8");response.setContentLength(out.size());ServletOutputStream outputStream = response.getOutputStream();outputStream.write(out.toByteArray());outputStream.flush();outputStream.close();}/*** @description 扫描二维码* @param  request* @Param  key* @Param  userId* @return  java.lang.String**/@GetMapping("/scanQrcode")@ResponseBodypublic String scanQrcode(HttpServletRequest request, String key, String userId) throws Exception {if(redisUtils.exists(key)){redisUtils.set(userId + "_qrcode_status", "success");return "扫描成功";}return "二维码失效, 请重新扫描";}/*** @description 验证扫描二维码* @param  userId**/@RequestMapping("/confirmQrcode")@ResponseBodypublic AjaxResult confirmQrcode(String userId){if(redisUtils.exists(userId + "_qrcode_status")){redisUtils.remove(userId + "_qrcode_status");//扫描成功后跳转新链接return AjaxResult.success("扫描成功", "/success");}return AjaxResult.error("二维码失效, 请重新扫描");}/*** @description 扫描二维码成功跳转页面* @param* @return  java.lang.String**/@GetMapping("/success")public  String success(ModelMap modelMap){return "success";}}

zxing生成二维码工具:

public class QRCodeUtil {private static final String CHARSET = "utf-8";private static final String FORMAT_NAME = "JPG";// 二维码尺寸private static final int QRCODE_SIZE = 300;// LOGO宽度private static final int WIDTH = 60;// LOGO高度private static final int HEIGHT = 60;private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws Exception {Hashtable hints = new Hashtable();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, CHARSET);hints.put(EncodeHintType.MARGIN, 1);BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}if (imgPath == null || "".equals(imgPath)) {return image;}// 插入图片QRCodeUtil.insertImage(image, imgPath, needCompress);return image;}private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {File file = new File(imgPath);if (!file.exists()) {System.err.println("" + imgPath + "   该文件不存在!");return;}Image src = ImageIO.read(new File(imgPath));int width = src.getWidth(null);int height = src.getHeight(null);if (needCompress) { // 压缩LOGOif (width > WIDTH) {width = WIDTH;}if (height > HEIGHT) {height = HEIGHT;}Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(image, 0, 0, null); // 绘制缩小后的图g.dispose();src = image;}// 插入LOGOGraphics2D graph = source.createGraphics();int x = (QRCODE_SIZE - width) / 2;int y = (QRCODE_SIZE - height) / 2;graph.drawImage(src, x, y, width, height, null);Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);graph.setStroke(new BasicStroke(3f));graph.draw(shape);graph.dispose();}public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);mkdirs(destPath);ImageIO.write(image, FORMAT_NAME, new File(destPath));}public static BufferedImage encode(String content, String imgPath, boolean needCompress) throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);return image;}public static void mkdirs(String destPath) {File file = new File(destPath);// 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)if (!file.exists() && !file.isDirectory()) {file.mkdirs();}}public static void encode(String content, String imgPath, String destPath) throws Exception {QRCodeUtil.encode(content, imgPath, destPath, false);}public static byte[] getQRCodeImage(String content) throws WriterException, IOException {QRCodeWriter qrCodeWriter = new QRCodeWriter();BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE);ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();MatrixToImageWriter.writeToStream(bitMatrix, FORMAT_NAME, pngOutputStream);byte[] pngData = pngOutputStream.toByteArray();return pngData;}public static void encode(String content, String destPath) throws Exception {QRCodeUtil.encode(content, null, destPath, false);}public static void encode(String content, String imgPath, OutputStream output, boolean needCompress)throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);ImageIO.write(image, FORMAT_NAME, output);}public static void encode(String content, OutputStream output) throws Exception {QRCodeUtil.encode(content, null, output, false);}public static String decode(File file) throws Exception {BufferedImage image;image = ImageIO.read(file);if (image == null) {return null;}BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));Result result;Hashtable hints = new Hashtable();hints.put(DecodeHintType.CHARACTER_SET, CHARSET);result = new MultiFormatReader().decode(bitmap, hints);String resultStr = result.getText();return resultStr;}public static String decode(String path) throws Exception {return QRCodeUtil.decode(new File(path));}//获取生成二维码的图片流public static ByteArrayOutputStream encodeIO(String content,String imgPath,Boolean needCompress) throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath,needCompress);//创建储存图片二进制流的输出流ByteArrayOutputStream baos = new ByteArrayOutputStream();//将二进制数据写入ByteArrayOutputStreamImageIO.write(image, "jpg", baos);return baos;}
}

3.demo下载:https://download.csdn.net/download/weixin_39220472/33632560

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_771836.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.net构建大型网站

记得很多朋友问过我如何构建一个大型的.net网站.这里值得讨论的问题是----多大 ,公司曾经需要我给他们做一个每天有1000万人次访问的门户网站.而我却一直都没有开始动手做...原因很简单,,做一个这样的网站,经费少于300万是不够的.因此需求分析和启动资金成为了规划开始的关键. …

使用Varnish代替Squid做网站缓存加速器的详细解决方案

我曾经写过一篇文章──《初步试用Squid的替代产品──Varnish Cache网站加速器》&#xff0c;但当时仅仅是用着玩&#xff0c;没做深入研究。  今天写的这篇关于Varnish的文章&#xff0c;已经是一篇可以完全替代Squid做网站缓存加速器的详细解决方案了。网上关于Varnish的资…

LAMP网站架构方案分析

LAMP&#xff08;Linux-Apache-MySQL-PHP&#xff09;网站架构是目前国际流行的Web框架&#xff0c;该框架包括&#xff1a;Linux操作系统&#xff0c;Apache网络服务器&#xff0c;MySQL数据库&#xff0c;Perl、PHP或者Python编程语言&#xff0c;所有组成产品均是开源软件&a…

网站安全演讲稿

主要包括HTML字符破坏、外部提交、SQL注入、XSS跨站攻击等几个方面。

大型互联网网站架构心得

我们知道&#xff0c;对于一个大型网站来说&#xff0c;可伸缩性是非常重要的&#xff0c;怎么样在纵向和横向有良好的可伸缩性&#xff0c;就需要在做架构设计的时候考虑到一个分的原则&#xff0c;我想在多个方面说一下怎么分&#xff1a; 首先是横向的分&#xff1a;1. 大的…

.net core 跳转页面_网站怎么做404页面,以及网站怎样绑定多个域名

为了使网站更好地为用户浏览和更好的体验&#xff0c;有时用户在打开网站时会有一些错误页面。 这时&#xff0c;我们必须在网站中创建一个404页面以跳转到该网站的首页&#xff0c;这对于保留用户是有好处的&#xff0c;同时有效地告诉搜索索引这些页面已经消失了&#xff01;…

网站可以如此复制?

论坛中碰到如此问题&#xff1a;我们做了一个网站,域名是www.3322173.com 没想到今天忽然发现了www.qiepeng.cn的内容和我们的是一模一样...内容也是同步更新,只是把内容中3322173.com替换成qiepeng.cn 我关闭我自己的IIS后,两个域名都不能访问了. 我郁闷啊,这是什么样的技术哦…

一步步构建大型网站架构

一步步构建大型网站架构 之前我简单向大家介绍了各个知名大型网站的架构&#xff0c;MySpace的五个里程碑、Flickr的架构、YouTube的架构、PlentyOfFish的架构、WikiPedia的架构。这几个都很典型&#xff0c;我们可以从中获取很多有关网站架构方面的知识&#xff0c;看了之后你…

Anonymous几天之内攻陷500多个中国网站

根据CNET的报道&#xff0c;Anonymous***激进组织已经在几天之内黑掉了超过500个中国政府/商业网站&#xff0c;并号召中国***加入他们。 The hacked Web site for the Central Business District in Chengdu, China. (Credit: Screenshot by Steven Musil/CNET)

烂泥:使用火狐解决网站图片不能复制下载的问题

本文首发于&#xff1a;烂泥行天下www.lanni654321.com由LureDresswww.luredress.com提供赞助 由于博客的需要&#xff0c;需要转载和下载一些网络上的图片&#xff0c;比如最近在阿里巴巴上看到的图片。想下载一些图片&#xff0c;但是阿里巴巴禁用鼠标的右键功能。网络上也有…

Java实现网站请求流量分析统计

如上图所描绘的&#xff0c;在不断刷新test.html请求页面时&#xff0c;上图total.html页面会实时的更新&#xff08;1秒响应更新一次&#xff09;&#xff0c;折线图会实时进行上下变动。其中需要导入echarts.min.js和jquery-3.5.1.min.js和fastjson-1.2.53.jar包。 0.首先是…

从vancl看垂直商业网站的崛起

如果说2007年IT业内的几大事件&#xff0c;卖衬衣的卖火了&#xff0c;这肯定是2007年的重大事件之一。提起卖衬衣的&#xff0c;大家肯定会想到的是PPG&#xff0c;但我为什么不拿PPG做标题呐&#xff1f;我认为PPG并不是真正的互联网公司&#xff0c;PPG只是打了一个网络直销…

55个漂亮的蓝色风格网站设计作品欣赏(上篇)

蓝色是光的三原色中的一元&#xff0c;是最冷的色彩&#xff0c;非常纯净&#xff0c;通常让人联想到海洋、天空、水、宇宙。纯净的蓝色表现出一种美丽、冷静、理智、安详与广阔。今天&#xff0c;本文收集了一些优秀的蓝色风格的网站设计作品与大家分享&#xff0c;一起欣赏。…

大型电子商务网站架构求解

这是一个技术提问帖,更是一个技术回复分享帖!希望有经验的朋友能够不吝赐教,让我们能在回复中分享到技术!同样希望管理员同志不要将此贴移出首页区,在讨论中学习和分享知识也是一种学习的方式,不是吗?---------------------------------华丽的分割线-------------------------…

Apache主导全美100大网站

随着同 IIS 的竞争以及 Lighttpd 的崛起&#xff0c;关于 Apache 市场下滑的声音不绝于耳&#xff0c;但 Pingdom 的统计表明&#xff0c;Apache仍然主导全美100大网站&#xff0c;占据了49%的市场份额。在 Pingdom 检测的众多网站中&#xff0c;Web服务器的使用五花八门&…

Wordpress Seo 优化的几个建议

WordPress SEO一直是大家很关系的问题&#xff0c;我们也曾经发过WordPress SEO 完全指南&#xff0c;那篇文章系统而详细的见解了如何对WordPress进行优化&#xff0c;今天Wopus中文平台的SEO顾问swsw007给大家分享他的一些WordPress SEO的技巧。一、3步把wordpress打成seo良好…

年度盛宴——2012年排名前20的 HTML5 应用和网站作品

过去的2012年&#xff0c;Web 领域有众多新变化&#xff1a;HTML5 将在2014年成为推荐标准&#xff1b;W3C 任命了4位新编辑来管理 HTML5 规范并托管到 Github 上面&#xff1b;WHATWG 继续致力于活动的 HTML 标准&#xff08;Living Standard&#xff09;。 您可能感兴趣的相关…

android客户端和网站数据交互的实现(基于Http协议获取数据方法)

android客户端一般不直接访问网站数据库&#xff0c;而是像浏览器一样发送get或者post请求&#xff0c;然后网站返回客户端能理解的数据格式&#xff0c;客户端解析这些数据&#xff0c;显示在界面上&#xff0c;常用的数据格式是xml和json。 可以理解客户端其实是一个你自己定…

ASP.NET网站管理工具的初始配置

ASP.NET 网站管理工具是ASP.NET2.0以来VS提供的操作Web.config的GUI.使用起来比直接编辑Web.config方便一些.但初始化配置时会遇到以下麻烦. 参考几个blog和俺自己的实验,总结点东西写写. 1、打开ASP.NET网站管理工具 有两个方法可以打开这个工具。 &#xff08;1&#xff…

网站加速将由CDN技术实现

2019独角兽企业重金招聘Python工程师标准>>> 过去的两年里,人们熟悉互联网CDN(内容分发网络)越来越深入的理解和印象。如果以前的用户下载信息,软件,甚至玩网络游戏已经在参考的言语CDN的技术,所以现在人们分享视频,视频点播流媒体或广播更依赖加。CDN毫无疑问,CDN技…