开发者社区> 王爵nice> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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;
	}
}

实现效果:

160051_lS0m_1767531.png

160042_NvWx_1767531.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《阿里特邀专家关键:Java无锁集合代码分析》电子版地址
阿里特邀专家关键:Java无锁集合代码分析
0 0
《Java开发者面试百宝书》电子版地址下载
敲黑板!Java求职者看过来!保姆级面试干货你要不要!《Java开发者面试百宝书》集结阿里Java大神一手面试经验诚意出品,精选了阿里官方出品的面试干货和面试建议,包括Java面试常见问题标准答案以及阿里技术大神为你总结的面试要点。
0 0
《Java开发手册(嵩山版)灵魂15问》电子版地址下载
《〈Java开发手册(嵩山版)〉灵魂15问》重磅来袭!“一线大厂如何用Java” 解读再升级,千万阅读量博主深究Java规约背后的原理。
0 0
《《阿里巴巴Java开发手册》1.3.0版本【非最新版】》电子版地址
《阿里巴巴Java开发手册》1.3.0版本【非最新版】
0 0
《Java开发手册(泰山版)灵魂13问》电子版地址下载
一线大厂怎么用Java?看千万阅读量技术博主给你分析!相信大家都读过《Java开发手册》泰山版,泰山版新增5条日期时间规约;新增2条表别名sql规约;新增统一错误码规约。 而《〈Java开发手册(泰山版)〉灵魂13问》则是为了帮助大家更好的理解这些规约背后的原理,从问题重现到原理分析再到解决问题,全网千万阅读量技术博主Hollis带你剖析阿里巴巴开发细节。
0 0
《云栖专家带你技术进阶之理解Java内存管理机制》电子版地址
云栖专家带你技术进阶之理解Java内存管理机制
0 0
《Java开发手册(嵩山版)》电子版地址下载
《Java开发手册(嵩山版)》经过不断地精进与苦练终于出山啦,它的内功提升之处在于依据约束力强弱及故障敏感性,规约依次分为【强制】、【推荐】、【参考】三大类。祝各位码林高手能够码出高效,码出质量!
0 0
+关注
王爵nice
https://github.com/biezhi
文章
问答
文章排行榜
最热
最新
相关电子书
更多
JAVA 应用排查全景图
立即下载
Java工程师必读手册
立即下载
Java应用提速(速度与激情)
立即下载