Java:如何轻松检查URL是否已缩短?
如果我有这样一个通用url(不限于twitter或谷歌):Java:如何轻松检查URL是否已缩短?,java,url-shortener,Java,Url Shortener,如果我有这样一个通用url(不限于twitter或谷歌): http://t.co/y4o14bI 是否有一种简单的方法来检查此url是否缩短 在上述情况下,作为一个人,我当然可以看到它是缩短的,但有没有一种自动且优雅的方法?如果您知道可以用来缩短URL的所有域,请检查它是否包含: String[] domains = {"bit.ly", "t.co"...}; for(String domain : domains){ if(url.startsWith("http://" + dom
http://t.co/y4o14bI
是否有一种简单的方法来检查此url是否缩短
在上述情况下,作为一个人,我当然可以看到它是缩短的,但有没有一种自动且优雅的方法?如果您知道可以用来缩短URL的所有域,请检查它是否包含:
String[] domains = {"bit.ly", "t.co"...};
for(String domain : domains){
if(url.startsWith("http://" + domain)){
return true;
}
}
return false;
事实上,你作为一个人,不能。你知道它被缩短的唯一方式是它是一个t.co域。
y4o14bI
可以是您所知道的CMS标识符
最好的方法是使用已知较短URL的列表,并根据这些URL进行查找
即使这样,你也会有问题。我在个人域wtn.gd中使用bit.ly
因此,也将是一个缩短的网址
您可以执行HTTP头请求,然后检查301/302?您不能
您只能检查是否列出了几个缩写词,并检查url是否以它开头
您还可以尝试检查url是否短于给定的长度(并且包含路径/查询字符串),但某些较短的url(例如tinyurl)可能比普通站点(aol.com)的url长
我更喜欢已知的短消息列表。您可以请求URL,查看是否被重定向,如果是,假设这是一个短消息服务。为此,您必须读取HTTP状态代码 另一方面,您可以将一些URL缩短服务(t.co、bit.ly等)列入白名单,并假设所有指向这些域的链接都被缩短
第一种方法的缺点是不确定,有些站点在内部使用重定向。第二种方法的缺点是,您必须不断添加缩短服务,尽管只有少数几种被广泛使用。如果您请求这样的URL,您的HttpCLient应该接收HTTP重定向而不是HTML页面。这不是一个证据,但至少是一个提示。一个信号可能是请求URL并查看它是否导致重定向到另一个域。然而,如果对“缩短”的含义没有一个好的定义,就没有通用的方法。你不能:你必须根据假设工作 假设:
- url中是否存在
www
- 服务器名称是否以有效域结尾(例如
、com
等),或者是否具有edu
,其中co.xx
是有效的国家或组织代码xx
您可以根据其他url缩短链接添加更多假设。评估url并寻找一些线索:
- 该路径符合某些标准
- 只有一个步骤(即不是多个斜杠)
- 不以文件扩展名结尾
- 长度不超过X个字符(需要评估各种URL缩短服务并调整最大令牌长度的上限)
- HttpUrlConnection返回重定向响应代码(即301、302)
- 获取要测试的url李>
- 使用HttpURLConnection打开url
- 检查响应代码
- 如果它是一个有效的代码,例如200,那么您可以从连接对象中检索长格式的url字符串(如果它被缩短),或者返回原始格式(如果不是)
String addr = "http://t.co/y4o14bI";
URL url = new URL(addr);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
if (connection.getResponseCode() == 200) {
String longUrl = connection.url;
System.out.println(longUrl);
} else {
// You decide what you want to do here!
}
我建议使用android.util.Patterns.WEB\u URL
public static List<String> findUrls(String input) {
List<String> links = new ArrayList<>();
Matcher m = android.util.Patterns.WEB_URL.matcher(input);
while (m.find()) {
String url = m.group();
links.add(url);
}
return links;
}
公共静态列表findUrls(字符串输入){
列表链接=新建ArrayList();
Matcher m=android.util.Patterns.WEB\u URL.Matcher(输入);
while(m.find()){
字符串url=m.group();
添加链接(url);
}
返回链接;
}
否决票对我来说似乎有点苛刻。白名单知道URL缩短服务似乎不是一个坏主意(正如这里投票最多的答案所暗示的)。简单地编辑到+domain+“/”将使bit.lyingbuster.com“攻击”失败;)我认为,没有必要这么激进地否决:)