java 实现 生成短链接服务

java实现短链接转换服务

在这里插入图片描述
类似上图这种短信,对应的就是一个短链接。
看到原理也不难,于是先写个最简易版的玩玩,以后有需求了再补充吧

下面是一个简易版的短链接生成代码

搭个spring-boot服务,复制这两个controller,就能看到效果。


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Random;/*** @Description: 发号器随机生成*/
@RestController
@RequestMapping("/shortUrl")
public class ShortUrlController {private String BASE62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";// 短链url域名前缀private String shortUrlPrefix = "http://a.cn/";private HashMap<String, String> map = new HashMap<>();@RequestMapping("getShortUrl")public String getShortUrl(String longUrl) {String key = creatKey();while (map.containsKey(key)) {key = creatKey();}map.put(key, longUrl);return shortUrlPrefix + key;}@RequestMapping("getLongUrl")public String getLongUrl(String shortUrl) {return map.get(shortUrl.replace(shortUrlPrefix, ""));}private String creatKey() {Random rand = new Random();StringBuilder sb = new StringBuilder();for (int i = 0; i < 6; i++) {sb.append(BASE62.charAt(rand.nextInt(62)));}return sb.toString();}
}

import com.zs.qunfx.util.Base62Util;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;/*** @Description: 发号器自增生成*/
@RestController
@RequestMapping("/shortUrl2")
public class ShortUrl2Controller {// 短链url域名前缀private String shortUrlPrefix = "http://a.cn/";private HashMap<String, String> map = new HashMap<>();private Long num = 1000000L;@RequestMapping("getShortUrl")public String getShortUrl(String longUrl) {String key = creatKey();map.put(key, longUrl);return shortUrlPrefix + key;}@RequestMapping("getLongUrl")public String getLongUrl(String shortUrl) {return map.get(shortUrl.replace(shortUrlPrefix, ""));}private String creatKey() {String base62 = Base62Util.base62Encode(num);num++;return base62;}
}

在这里插入图片描述
在这里插入图片描述

最后

现在常用的还是第二种,用自增的发号器生成对应的短链接。
生产环境要用,可以用数据库的自增id来发号,或者分布式下生成id用类似雪花算法来发号。
同时,避免原始链接重复,可做重复判断,可用布隆过滤器或redis
长链接和短链接的对应关系,可保存在数据库,也可保存在类似redis中,顺带还可以设置过期时间。

也有开源的生成短链接的,比如yourls,PHP实现,安装只需要装PHP和mysql即可。

或者也可以直接购买短链接服务,比如百度的短链接服务,亚马逊的短链接服务等,按需付费。

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

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

相关文章

[转载] --- Fastjson1.2.68版及以下全版本远程代码执行漏洞通告

再这样&#xff0c;真的要放弃fastjson了 【安全通告】Fastjson <1.2.68全版本远程代码执行漏洞通告 尊敬的腾讯云用户&#xff0c;您好&#xff01;近日&#xff0c;腾讯云安全运营中心监测到&#xff0c;Fastjson <1.2.68版本存在远程代码执行漏洞&#xff0c;漏洞被利…

数据库选型经验汇总

数据库选型 下面这些都是免费开源的。 暂且不考虑数据量&#xff0c;大致的选型方案。 一般分析型数据库&#xff0c;都是可以支持GB到TB级别。 上面的分类都不是一定的&#xff0c;只是大体上的推荐。具体还得结合实际场景调整。 数据处理大致可以分成两大类&#xff1a; 联…

RabbitMQ和Kafka选型用哪个

作为一个有丰富经验的微服务系统架构师&#xff0c;经常有人问我&#xff0c;“应该选择RabbitMQ还是Kafka&#xff1f;” 基于某些原因&#xff0c; 许多开发者会把这两种技术当做等价的来看待。的确&#xff0c;在一些案例场景下选择RabbitMQ还是Kafka没什么差别&#xff0c…

【FPGA】分享一些FPGA视频图像处理相关的书籍

在做FPGA工程师的这些年&#xff0c;买过好多书&#xff0c;也看过好多书&#xff0c;分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…

错误记录:Current request is not a multipart request

springboot 报错&#xff1a;Current request is not a multipart request 这个一般是controller是带有上传文件的服务&#xff0c;类似RequestParam MultipartFile[] file 解决&#xff1a; 首先检查请求头中的Content-Type是否设置对&#xff0c;如果把Content-Type设置成a…

java 使用gzip压缩和解压 传输文件必备

java gzip 压缩解压工具类&#xff0c;开箱即用 gzip原理看我另外一篇介绍 压缩效果直接看图&#xff1a; package com.yeahmobi.datacheck.util;import java.io.*; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream;public class CompressUtil…

spring boot maven项目返回值乱码的解决方法

spring boot maven项目返回值乱码的解决方法 1、先看乱码效果&#xff1a; spring boot maven项目&#xff0c;返回值乱码&#xff0c;如下图&#xff1a; 控制台打印log乱码&#xff0c;如下图&#xff1a; 有swagger的话&#xff0c;swagger文档乱码&#xff0c;如下图&…

【错误记录】Invalid character found in method name. HTTP method names must be tokens

错误日志 [2020-08-14 10:47:11.262] [http-nio-8093-exec-7] [INFO] [o.a.c.h.Http11Processor] [Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.] java.lang.IllegalArgumentException: Invali…

redis 常见基础面试题

1、在项目中缓存是如何使用的&#xff1f;为什么要用缓存&#xff1f;缓存使用不当会造成什么后果&#xff1f; 面试官心理分析 这个问题&#xff0c;互联网公司必问&#xff0c;要是一个人连缓存都不太清楚&#xff0c;那确实比较尴尬。 只要问到缓存&#xff0c;上来第一个…

【转载】广告系统架构解密

广告、增值服务、佣金&#xff0c;是互联网企业最常见的三种盈利手段。在这3大经典中&#xff0c;又以广告所占的市场份额最大&#xff0c;几乎是绝大部分互联网平台最主要的营收途径&#xff0c;业务的重要性不言而喻。 从技术角度来说&#xff0c;广告业务涉及到 AI算法、大数…

【读书笔记】--- 《码出高效:java开发手册》

这几天读了几本书&#xff0c;突然觉得可以写点什么&#xff0c;因为我也看了不少书了&#xff0c;于是就有了个想法&#xff0c;我可以在我看过的每本书后&#xff0c;把我的一些想法记录下来&#xff0c;一方面可以供以后回忆&#xff0c;一方面可以让读者看到后&#xff0c;…

quartz 报错:Failure obtaining db row lock: Table ‘test.QRTZ_LOCKS‘ doesn‘t exist

问题&#xff1a; spring-boot 整合quartz的时候&#xff0c;连接windows的mysql的时候好好的&#xff0c;然而用linux上的mysql的时候&#xff0c;启动就报了这个错&#xff1a; Failure obtaining db row lock: Table ‘test.QRTZ_LOCKS’ doesn’t exist 分析&#xff1a…

关于SimpleDateFormat线程不安全的源码分析

SimpleDateFormat&#xff0c;线程不安全&#xff0c;源码分析 1、先看SimpleDateFormat类图 SimpleDateFormat继承了DateFormat DateFormat中有个成员变量是Calendar&#xff0c;这个先记住&#xff0c;线程不安全主要就是因为这个成员变量 2、看下图SimpleDateFormat的p…

vue 每次弹框都初始化

之前弹框都是下图这种&#xff1a; 通过detailOpen变量控制是否显示弹框 但这种最近在整合tinymce富文本编辑器的时候&#xff0c;发现第二次弹框数据没有回填 原因是因为第一次弹框关闭后&#xff0c;没有初始化&#xff0c;从而影响了后面的弹框功能。 修改成下图就好了&…

微信小程序支付流程(新手教程)

微信小程序支付流程&#xff1a; 一、前期申请准备工作 1、小程序注册&#xff0c;要以公司的以身份去注册一个小程序&#xff0c;才能开通微信支付权限&#xff1b; 个人申请的小程序是不具备“微信支付”功能的&#xff01; 但个人小程序可以生成微信支付的那个收款二维码&…

mysql 报错解决思考Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column

mysql报错&#xff1a; [Err] 1055 - Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘库名.表名.字段’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_g…

若依前后分离项目,发布在阿里云效中

后端服务 配置代码源 配置构建信息 mvn -B clean package -pl ruoyi-admin -am -Dmaven.test.skip=true -Dautoconfig.skip 项目名称和pom文件中保持一致,都叫ruoyi-admin

JVM基础知识汇总

1.jvm是什么 Java Virtual Machine&#xff08;Java虚拟机&#xff09;,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. 本文jvm是基于jdk7写的,关于jdk8的jvm,和jdk7的稍有不同,详见文章末尾链接 2.jvm能做什么 java语言之所以可以跨平台,就…

Longest Palindromic Substring Part II

Longest Palindromic Substring Part II 给定一个字符串 S, 找出字符串S中的最长回文子字符串. 注意: 这是关于:Longest Palindromic Substring.的第二篇文章了.在这里,我们讨论一种可以再线性时间内找到字符串中最长回文子字符串的一种算法(Manacher’s algorithm).请先阅读第…

Java反射基础(三)--Methods对象的使用

Method 原文地址:http://docs.oracle.com/javase/tutorial/reflect/member/method.html 1.获得方法类型信息 一个方法的声明包括方法名,修饰符, 参数, 和返回类型,同时还有一些方法可能抛出的异常. 类 java.lang.reflect.Method 提供了一种方式让我们可以得到方法的这些信息. …