如何检查URL的合法性?
来源:互联网 发布:中国程序员数量不够 编辑:程序博客网 时间:2024/04/26 06:12
这篇文章只关注一个URL字符串是否是合法的,并不讨论这个URL对应的资源是否能够访问(有效)。
如果想看Java代码实现的部分,建议直接看文章末尾。
先粗略研究一下概念,关于URI和URL的关系,维基百科上有比较好的介绍:[传送门]
其实看起来还是没太清楚,于是翻了RFC3986[传送门],找到了下面这个图:
The following are two example URIs and their component parts: foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment | _____________________|__ / \ / \ urn:example:animal:ferret:nose
上面的图给出了两个URI的例子。第一个例子是最常见的,大家每天都在用,这个博客的网址就属于这种。
http://blog.csdn.net/godric42/
其中http是scheme,更常用的说法是协议;blog.csdn.net是authority,也就是主机;/godric42/是path。
第二个例子对于使用P2P软件下载东西的同学也不陌生,可以去Google一下“磁力链接”。
有了上面的基本概念,我们约定:后文提到的“网址”,其实是在说URI。
下面用一个特例来看一下Java中URI类和URL类的区别。
String urlStr = "http://#/?a=b"; URI uri = null; try { uri = new URI(urlStr); } catch (URISyntaxException e) { e.printStackTrace(); } System.out.println(uri.getHost()); //null URL url = null; try { url = new URL(urlStr); } catch (MalformedURLException e) { e.printStackTrace(); } System.out.println(url.getHost()); //#
我们看到,使用URI和URL都能成功创建对象,但调用URI的getHost方法得到的是null,而调用URL的getHost方法输出是#。
使用URI这个类来判断一个网址的合法性是比较合适的,具体步骤如下:
- 先新建一个URI对象;
- 如果创建失败,则认为该URL不合法;
- 如果创建成功,再检查host是否为null;
- 如果host不为null,在检查协议是否是应用中能够处理的。
最终的代码如下。
public static boolean isValidUrl(String urlString){ URI uri = null; try { uri = new URI(urlString); } catch (URISyntaxException e) { e.printStackTrace(); return false; } if(uri.getHost() == null){ return false; } if(uri.getScheme().equalsIgnoreCase("http") || uri.getScheme().equalsIgnoreCase("https")){ return true; } return false;}
结论:使用URI类来判断地址的合法性比较方便。
思考:既然URL是URI的子集,那么Java的URL类和URI类为什么会返回不同的host结果呢?看来需要研究一下源码。
0 0
- 如何检查URL的合法性?
- java检查URL合法性
- java 检查 URL 合法性
- 在JAVA中如何检查字符串日期的合法性
- 在JAVA中如何检查字符串日期的合法性
- 验证URL的合法性
- VBA 检查IP的合法性
- 检查密码的规则合法性
- js判断url的合法性
- 合法性检查
- 如何检查Windows用户在域中的合法性(存在、合法)
- 利用正则表达式检查时间的合法性
- ABAP检查日期时间合法性的函数
- js正则表达式检查时间的合法性
- ABAP检查日期时间合法性的函数
- Delphi检查IP地址的合法性
- Python 实现简单的命名合法性检查
- ABAP检查日期时间合法性的函数
- lua 之 menu
- 易语言mysql
- 利用css中的border生成三角,兼容包括IE6的主流浏览器
- ROS探索总结(十二)——坐标系统
- Java学习笔记_19_String类
- 如何检查URL的合法性?
- Linux串口编程(中断方式和select方式
- Valgrind介绍2
- Windows 7中本地SVN搭建问题详解
- ORA 12505 Listener does not currently know of SID given in connection descriptor
- UML图(四) 对象图
- 阿胶糕的制作方法_(给自己妈妈留着)
- Java使用Socket进行字符串和图片文件同时传输
- springMVC3学习--访问静态文件