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; }
实现效果:
《Java开发者面试百宝书》电子版地址下载 敲黑板!Java求职者看过来!保姆级面试干货你要不要!《Java开发者面试百宝书》集结阿里Java大神一手面试经验诚意出品,精选了阿里官方出品的面试干货和面试建议,包括Java面试常见问题标准答案以及阿里技术大神为你总结的面试要点。
《Java开发手册(嵩山版)灵魂15问》电子版地址下载 《〈Java开发手册(嵩山版)〉灵魂15问》重磅来袭!“一线大厂如何用Java” 解读再升级,千万阅读量博主深究Java规约背后的原理。
《Java开发手册(泰山版)灵魂13问》电子版地址下载 一线大厂怎么用Java?看千万阅读量技术博主给你分析!相信大家都读过《Java开发手册》泰山版,泰山版新增5条日期时间规约;新增2条表别名sql规约;新增统一错误码规约。 而《〈Java开发手册(泰山版)〉灵魂13问》则是为了帮助大家更好的理解这些规约背后的原理,从问题重现到原理分析再到解决问题,全网千万阅读量技术博主Hollis带你剖析阿里巴巴开发细节。
《Java开发手册(嵩山版)》电子版地址下载 《Java开发手册(嵩山版)》经过不断地精进与苦练终于出山啦,它的内功提升之处在于依据约束力强弱及故障敏感性,规约依次分为【强制】、【推荐】、【参考】三大类。祝各位码林高手能够码出高效,码出质量!
相关文章
- MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池
- Java Swing
- java web mysql.jar java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
- Java反射异常:java.lang.NoSuchFieldException
- JAVA学习(四):Java流程控制语句(顺序结构、if条件语句、switch条件语句、循环语句与跳转语句)
- Java实现 蓝桥杯 算法训练 Beaver's Calculator
- Java实现 LeetCode 382 链表随机节点
- Java实现 蓝桥杯 历届试题 九宫重排
- Java实现DFS深度优先查找
- Java实现蓝桥杯正则问题
- Java实现 蓝桥杯 算法提高 文本加密
- 【JAVA】毕向东Java基础视频教程-笔记
- 【JAVA】 03-Java中的异常和包的使用
- 【JAVA调错】----JBoss发布多个项目时抛出webAppRootKey错误
- Java_myBatis_全局配置文件
- C#和JAVA的RSA密钥、公钥转换
- Atitit web httphandler的实现 java python node.js c# net php 目录 1.1. Java 过滤器 servelet1 1.2. Python的
- Atitit 搜索蓝牙设备 powershell的实现 java noede.js python 先用脚本语言python nodejs,不好实现。。Java 也不好实现。。 Netcore可以,
- Java — java.lang.NullPointerException - 如何处理空指针异常
- 《Java并发编程实战》第九章 图形用户界面应用程序界面 读书笔记
- 【华为OD机试 2023】 二进制差异数(C++ Java JavaScript Python)
- Java中的final变量 final修饰变量 final修饰方法 final修饰类 final和String的关系
- Java如何创建用户自定义异常?
- 【JAVA面试必会】JMM高并发详解(java内存模型、JMM三大特征、volatile关键字 )
- Java:openjdk: error: Student is abstract; cannot be instantiated;java编译环境