zl程序教程

您现在的位置是:首页 >  后端

当前栏目

java实现短地址服务

2023-09-14 08:59:36 时间

假设下面是你的视频网站链接列表,如果别人想爬取你的数据十分轻松,看规则就知道数据库是序列自增的

http://www.xxxx.com/video/1

http://www.xxxx.com/video/2

http://www.xxxx.com/video/3

那么解决这一问题,我们可以使用短地址,不对外暴露真实链接,使用对称加密是一个很好的方案。

Hashids是一个很好的选择,它提供了JS/PHP/JAVA/PYTHON等编程语言的实现,这里我使用的就是它。

下面是我基于blade框架搭建的java短地址服务。

CREATE TABLE `t_url` (

  `id` int(10) NOT NULL AUTO_INCREMENT,

  `url` text NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

路由

@Path

public class IndexRoute {

        // 盐值

 private static final Hashids HASHIDS = new Hashids("blade-shorturl");

 private UrlModel urlModel = new UrlModel();

 @Route("/:key")

 public void get(Request req, Response response) {

 String key = req.pathParam(":key").replaceAll("[^A-Za-z0-9]", "");

 long[] numbers = HASHIDS.decode(key);

 if (null == numbers || numbers.length   1) {

 response.text("没有找到");

 return;

 int id = (int) numbers[0];

 String result = get(id).getUrl();

 if (result == null) {

 response.text("没有找到");

 return;

 response.redirect(result);

 @Route(value = "/", method = HttpMethod.GET)

 public String index() {

 return "index";

 @Route(value = "/", method = HttpMethod.POST)

 public String save(Request request, Response response) {

 String resJsp = "index";

 String longUrl = request.query("url");

 if (!isURL(longUrl)) {

 request.attribute("error", "无效的URL");

 return resJsp;

 Integer id = this.save(longUrl);

 if (id == 0) {

 request.attribute("error", "保存失败");

 return resJsp;

 String hash = HASHIDS.encode(id);

 request.attribute("url_hash", hash);

 System.out.println("id = " + id + ",url_hash=" + hash);

 return resJsp;

 private Integer save(String url) {

 return urlModel.insert().param("url", url).executeAndCommit();

 private UrlModel get(int id) {

 return urlModel.fetchByPk(id);

 private final String REGEX = "\\b(https?|ftp|file)://[-a-zA-Z0-9+ @#/%?=~_|!:,.;]*[-a-zA-Z0-9+ @#/%=~_|]";

 private boolean isURL(String url) {

 if(StringKit.isNotBlank(url)){

 Pattern pattern = Pattern.compile(REGEX);

 Matcher matcher = pattern.matcher(url);

 if (matcher.find()) {

 return true;

 return false;

}

实现效果:

160051_lS0m_1767531.png

160042_NvWx_1767531.png


《Java开发者面试百宝书》电子版地址下载 敲黑板!Java求职者看过来!保姆级面试干货你要不要!《Java开发者面试百宝书》集结阿里Java大神一手面试经验诚意出品,精选了阿里官方出品的面试干货和面试建议,包括Java面试常见问题标准答案以及阿里技术大神为你总结的面试要点。
《Java开发手册(嵩山版)灵魂15问》电子版地址下载 《〈Java开发手册(嵩山版)〉灵魂15问》重磅来袭!“一线大厂如何用Java” 解读再升级,千万阅读量博主深究Java规约背后的原理。
《Java开发手册(泰山版)灵魂13问》电子版地址下载 一线大厂怎么用Java?看千万阅读量技术博主给你分析!相信大家都读过《Java开发手册》泰山版,泰山版新增5条日期时间规约;新增2条表别名sql规约;新增统一错误码规约。 而《〈Java开发手册(泰山版)〉灵魂13问》则是为了帮助大家更好的理解这些规约背后的原理,从问题重现到原理分析再到解决问题,全网千万阅读量技术博主Hollis带你剖析阿里巴巴开发细节。
《Java开发手册(嵩山版)》电子版地址下载 《Java开发手册(嵩山版)》经过不断地精进与苦练终于出山啦,它的内功提升之处在于依据约束力强弱及故障敏感性,规约依次分为【强制】、【推荐】、【参考】三大类。祝各位码林高手能够码出高效,码出质量!