java实现短地址服务的方法(附代码)
作者:王爵 发布时间:2023-11-15 19:13:41
标签:java,短地址
假设下面是你的视频网站链接列表,如果别人想爬取你的数据十分轻松,看规则就知道数据库是序列自增的
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;
}
}
实现效果:
代码位置:https://github.com/bladejava/blade-shorturl


猜你喜欢
- 前言前面文章讲了消息是如何保存的以及consumeQueue与Index文件更新机制。随着消息的增加,Broker不可能一直保存所有消息,B
- 登录添加验证码是一个非常常见的需求,网上也有非常成熟的解决方案,其实,要是自己自定义登录实现这个并不难,但是如果需要在 Spring Sec
- 一:背景1. 讲故事高级语言玩多了,可能很多人对指针或者汇编都淡忘了,本篇就和大家聊一聊指针,虽然C#中是不提倡使用的,但你能说指针在C#中
- 废话不多说了,下面代码给大家介绍下利用正则表达式判断字符的方法,具体代码如下所示:using System;using System.Tex
- 安装nodejs首先电脑中需要安装nodejs,这个就不多提了,windows就是下载node.exe,一步步安装就可以了。如需安装可参考一
- 在国际化环境下,越来越多的程序需要做多语言版本,以适应各种业务需求的变化。在Winform应用程序中实现多语言也有常规的处理方式处理,不过需
- 问题:startTime = DateTime.Now;
- 最近遇到一个问题,用RecyclerView显示数据,纵向列表显示,添加默认分割线。问题是:底部也会显示分割线,这很影响美观。怎么解决这个问
- 一、需求Jenkins大多数情况下都是用来部署Java项目,Java项目有一个特点是>需要编译和打包的,一般情况下编译和打包都是用ma
- 在实际项目开发过程中,我们经常需要对某个对象或者某个集合中的元素进行排序,常用的两种方式是实现某个接口。常见的可以实现比较功能的接口有Com
- 详解path和classpath的区别path的作用path是系统用来指定可执行文件的完整路径,即使不在path中设置JDK的路径也可执行J
- 前言static和final是两个我们必须掌握的关键字。不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优
- 在java的开发中,java开发人员建议,尽量少用内部类,要把内部类提出他所处的那个类,单独生成一个类。直接来代码:package com.
- 对于使用文件进行交换数据的应用来说,使用FTP 服务器是一个很不错的解决方案。关于FileZilla Server服务器的详细搭建配置过程,
- 线程中start方法与run方法的区别在线程中,如果start方法依次调用run方法,为什么我们会选择去调用start方法?或者在java线
- 一、 springBoot + Mybatis配置完成后,访问数据库遇到的问题首先出现这个问题,肯定是xml文件与mapper接口没有匹配上
- 1. 配置MailPlugin插件public void configPlugin(PluginLoader pluginLoader) {
- 介绍和使用场景1)什么是消息一个事件,需要广播或者单独传递给某个接口2)为什么使用这个配置更新了,但是其他系统不知道是否更新SpringCl
- java对字符串进行utf-8编码我们在调用第三方 API 时,常常会被要求用到路径变量,而路径变量一般都是 utf-8 编码的,因此需要对
- 在日常工作中,我们往往只关注 Java 内存使用情况,这主要是因为 Java 内存分析相关的工具比较多。与之不同的是,图片内存分析的工具比较