为 java.net.URI getUserInfo 处理带有“@”的 URL

Handling URLs which have '@' for java.net.URI getUserInfo

我有一个字符串,其中定义了 FTP URL,我想从该字符串中解析用户名和密码详细信息。为此,我使用 java.net.URI (https://docs.oracle.com/javase/6/docs/api/java/net/URI.html)...

的 getUserInfo 方法
 def userInfo = uri.getUserInfo()
 def username
 def password

   if(userInfo){
      def pos = userInfo.indexOf(":")
      if(pos >= 0){
          username = userInfo.substring(0, pos)
          password = userInfo.substring(pos+1)
   }    
 }   

这段代码工作正常,除非 URL 中有一个 '@',就像这样..

 ftp://kirk@starfleet.com:spock123@enterprise.com/orders.txt

对于这样的 URL,调用 uri.getUserInfo() returns null.

有什么办法可以处理这样的URL吗?

@ 不是 URL 中的用户名或密码中的有效字符。它必须被编码。因此,如果您像这样编写 URI,您的代码将起作用:

ftp://kirk%40starfleetcom:spock123@enterprisecom/orders.txt

afaik,在构建 URI 之前,您应该简单地对用户名和密码进行 url 编码:

java.net.URLEncoder.encode(username)