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;漏洞被利…

[记录] --- safari浏览器对于yyyy-MM的坑

问题 后端给前端返回的带格式的日期类型时&#xff0c;很多时候都是yyyy-MM-dd格式的&#xff0c;在一般浏览器中都没问题&#xff0c;但safari浏览器就会出问题。 解决&#xff1a; 换成yyyy/MM/dd格式

数据库选型经验汇总

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

excel导出经验

excel导出经验&#xff0c;供参考 数据量&#xff1a;1万以下 直接导出&#xff0c;正常在5秒内 数据量&#xff1a;1万-10万 直接导出&#xff0c;正常在10秒内 数据量&#xff1a;超过10万&#xff0c;建议多文件导出。 可使用多线程查询&#xff0c;比如一个线程查1万…

LeetCode删除排序数组中的重复项(Java实现)

原题&#xff1a; 给定一个排序数组&#xff0c;你需要在 原地 删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1: …

关于高考报志愿的一些规划建议

目录前言1、报志愿&#xff0c;选大学中国大学的档次报志愿的整体思路不同分数线的报志愿建议超出一本分数线100分以上超过一本分数线50分左右到100分刚刚超过一本分数线不到50分二本分数线超很多&#xff0c;但刚好没上一本分数线刚上二本分数线的三本分数线专科分数线选择大学…

RabbitMQ和Kafka选型用哪个

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

spring boot controller 增加指定前缀的两种方法

1、增加配置 server.servlet.context-path: /api 这种是最常见的&#xff0c;加上这个配置后&#xff0c;所有的url&#xff0c;必须带上/api的前缀&#xff0c;才能访问到该url 2、过滤拦截 这种是加上/api也可以访问&#xff0c;不加/api也可以访问&#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;如下图&…

云服务和serverless

云服务中的一些基础概念 IaaS&#xff08;Infrastructure as a server&#xff09;基础设施即服务 基础设施就是物理服务器 云服务厂商把物理服务器搭好&#xff0c;直接卖云端服务器或者虚拟机 用户可以自己装系统&#xff0c;然后装软件等等 PaaS&#xff08;Platform as …

【错误记录】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;上来第一个…

api接口设计

api接口设计 健壮性 对外提供的接口&#xff0c;最好支持幂等性&#xff0c;即相同的请求重复调用&#xff0c;服务端的操作应该只有一次&#xff0c;并且每次返回的结果应该是一样的。 一般的做法是要求客户端在每次调用的时候带上唯一键&#xff0c;服务端第一次正常处理&a…

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

广告、增值服务、佣金&#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…

quartz 本地有效,线上失效的问题

问题&#xff1a; 最近开了一个新项目&#xff0c;spring boot 整合了quartz&#xff0c;出现了一个问题&#xff0c;就是当项目连接到本地电脑的数据库时&#xff0c;一切正常。但是当项目连接远程linux上的数据库的时候&#xff0c;发现定时任务不灵了&#xff0c;也不是不执…