当前位置: 首页 > 面试题库 >

如何将URL编码为“可浏览”?

唐彦
2023-03-14
问题内容

我想知道是否有任何方法可以解析这样的URL:

https://www.mysite.com/lot/of/unpleasant/folders/and/my/url with spaces &"others".xls

进入

https://www.mysite.com/lot/of/unpleasant/folders/and/my/url%20with%20spaces%20&%22others%22.xls

类似于Firefox进行的URL重写,即仅粘贴以前的URL,然后将其发送到服务器(除非有这样的站点,否则没有响应),然后从导航栏中复制URL并将其粘贴到其他位置。

使用URLEncoder#encode给我这个(不需要的)输出:

https%3A%2F%2Fwww.mysite.com%2Flot%2Fof%2Funpleasant%2Ffolders%2Fand%2Fmy%2Furl+with+spaces+%26%22others%22.xls

不幸的是,我收到问题开头所示的字符串,因此URLEncoder#encode直接使用不起作用。

我天真地尝试了这个:

String evilUrl = "https://www.mysite.com/lot/of/unpleasant/folders/and/my/url with spaces &\"others\".xls";
URI uri = null;
String[] urlParts = evilUrl.split("://");
String scheme = urlParts[0];
urlParts = urlParts[1].split("/");
String host = urlParts[0];
StringBuilder sb = new StringBuilder('/');
for (int i = 1; i < urlParts.length; i++) {
    sb.append('/');
    sb.append(urlParts[i]);
}
uri = new URI(scheme, host, sb.toString(), null);
System.out.println(uri.toASCIIString());

并给出以下(更好的)输出:

https://www.mysite.com/lot/of/unpleasant/folders/and/my/url%20with%20spaces%20&%22others%22.xls

但是我不确定是否有针对此问题的现成的解决方案,并且我正在全力以赴,还是可以依靠这段代码几乎成功地解决了我的问题。


问题答案:

这类url的问题在于它们是部分编码的,如果您尝试使用开箱即用的编码器,它将始终对整个字符串进行编码,因此我想您使用自定义编码器的方法是正确的。您的代码还可以,您只需要添加一些验证,例如,如果“
evil url”不随协议部分一起提供(即没有“ https://”),除非您非常确定,该怎么办?它永远不会发生。

我有一些空闲时间,所以我做了一个替代的自定义编码器,我遵循的策略是解析URL中不允许的字符并仅对那些字符进行编码,而不是尝试重新编码整个内容:

private static String encodeSemiEncoded(String semiEncondedUrl) {
    final String ALLOWED_CHAR = "!*'();:@&=+$,/?#[]-_.~";
    StringBuilder encoded = new StringBuilder();
    for(char ch: semiEncondedUrl.toCharArray()) {
        boolean shouldEncode = ALLOWED_CHAR.indexOf(ch) == -1 && !Character.isLetterOrDigit(ch) || ch > 127;
        if(shouldEncode) {
            encoded.append(String.format("%%%02X", (int)ch));
        } else {
            encoded.append(ch);
        }
    }
    return encoded.toString();
}

希望这可以帮助



 类似资料:
  • 我正在做一个测试,Firefox如何编码字符。 但事实让我困惑。 超文本标记语言代码: xxx是一些汉字。这些字符必须编码成%xx等格式才能通过HTTP传输。 首先,我用UTF-8编码源文件。使用firefox打开html文件。img标签将发送一个请求,“xxx”字符由UTF8编码。 (用UTF8编码HTML源文件,字符集=UTF8,浏览器用UTF编码URL) 我把meta改成了

  • 我正在尝试使用JSoup获取此URL http://betatruebaonline.com/img/parte/330/ciguen%c3%91al.jpg 相反,正确的 http://betatruebaonline.com/img/parte/330/ciguen%cc%83al.jpg 我该怎么解决这个?多谢了。

  • 问题内容: 我在将URL编码为URI时遇到问题: 这不能满足我对以下URL的期望: 传递字符串: http://m.bloomingdales.com/img?url=http%3A%2F%2Fimages.bloomingdales.com%2Fis%2Fimage%2FBLM%2Fproducts%2F3%2Foptimized%2F1140443_fpx.tif%3Fwid%3D52%26q

  • URL编码是将URL中具有特殊含义的不可打印字符或字符转换为明确且由Web浏览器和服务器普遍接受的表示的实践。 这些字符包括 - ASCII control characters - 通常用于输出控制的不可打印字符。 字符范围为00-1F十六进制(十进制0-31)和7F(十进制127)。 下面给出了完整的编码表。 Non-ASCII control characters - 这些是超过128个字符

  • URL编码是将URL中具有特殊含义的不可打印字符或字符转换为明确且由Web浏览器和服务器普遍接受的表示的实践。 这些字符包括 - ASCII control characters - 通常用于输出控制的不可打印字符。 字符范围为00-1F十六进制(十进制0-31)和7F(十进制127)。 下面给出了完整的编码表。 Non-ASCII control characters - 这些是超过128个字符

  • 问题内容: 我想对此进行网址编码: 我需要为此下载一个模块吗?我已经有了请求模块。 问题答案: 您可以使用JavaScript的: