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(10NOT 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;
	}
}

实现效果:

目录
相关文章
|
3月前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
106 4
|
4月前
|
Java Maven Windows
使用Java创建集成JACOB的HTTP服务
本文介绍了如何在Java中创建一个集成JACOB的HTTP服务,使Java应用能够调用Windows的COM组件。文章详细讲解了环境配置、动态加载JACOB DLL、创建HTTP服务器、实现IP白名单及处理HTTP请求的具体步骤,帮助读者实现Java应用与Windows系统的交互。作者拥有23年编程经验,文章来源于稀土掘金。著作权归作者所有,商业转载需授权。
使用Java创建集成JACOB的HTTP服务
|
3月前
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
194 6
|
3月前
|
前端开发 Java API
JAVA Web 服务及底层框架原理
【10月更文挑战第1天】Java Web 服务是基于 Java 编程语言用于开发分布式网络应用程序的一种技术。它通常运行在 Web 服务器上,并通过 HTTP 协议与客户端进行通信。
54 1
|
2月前
|
Java Spring
JAVA获取重定向地址URL的两种方法
【10月更文挑战第17天】本文介绍了两种在Java中获取HTTP响应头中的Location字段的方法:一种是使用HttpURLConnection,另一种是使用Spring的RestTemplate。通过设置连接超时和禁用自动重定向,确保请求按预期执行。此外,还提供了一个自定义的`NoRedirectSimpleClientHttpRequestFactory`类,用于禁用RestTemplate的自动重定向功能。
145 0
|
3月前
|
Java 关系型数据库 MySQL
java控制Windows进程,服务管理器项目
本文介绍了如何使用Java的`Runtime`和`Process`类来控制Windows进程,包括执行命令、读取进程输出和错误流以及等待进程完成,并提供了一个简单的服务管理器项目示例。
53 1
|
4月前
|
JSON Java 数据格式
java调用服务报错400
java调用服务报错400
80 2
|
4月前
|
JSON Java 数据格式
java调用服务报错415 Content type ‘application/octet-stream‘ not supported
java调用服务报错415 Content type ‘application/octet-stream‘ not supported
120 1
|
3月前
|
Java 数据库
基于java的汽车服务管理系统(Car Service Management System)
基于java的汽车服务管理系统(Car Service Management System)
31 0
|
4月前
|
Java 数据库连接 数据库
Java服务提供接口(SPI)的设计与应用剖析
Java SPI提供了一种优雅的服务扩展和动态加载机制,使得Java应用程序可以轻松地扩展功能和替换组件。通过合理的设计与应用,SPI可以大大增强Java应用的灵活性和可扩展性。
83 18