2013-07-17 47 views
0

在我的web应用程序中,我正在重定向到外部URL,该URL包含一些凭据作为URL字符串的一部分。我想在重定向之前单独对凭证部分进行编码。我有以下网址:Java URL编码

String url1 = "http://servername:7778/reports/rwservlet?server=server1&ORACLE_SHUTDOWN=YES&PARAMFORM=no&report=test.rdf&desformat=pdf&desname=test.pdf&destype=cache&param1=56738&faces-redirect=true&"; 

我其编码为:

String URL = "userid=username/[email protected]"; 
encodedURL = URLEncoder.encode(URL, "UTF-8"); 
String redirectURL = url1 + encodedURL1; 

这段代码生成的URL是

http://servername:7778/reports/rwservlet?server=server1&ORACLE_SHUTDOWN=YES&PARAMFORM=no&report=test.rdf&desformat=pdf&desname=test.pdf&destype=cache&param1=56738&faces-redirect=true&userid=%3Dusername%2Fpasswd%40DBname 

我们可以对编码的结尾看到URL,只有像/这样的特殊字符被编码。即userid=username/[email protected]已成为userid=%3Dusername%2Fpasswd%40DBname

我想要生成一个URL,其中将编码整个字符串“username/passwd @ DBname”。例如:

userid=%61%62 

我该如何做到这一点?

+0

这没有任何意义。你是否意识到,如果没有一个愿望最终用户的努力,这仍然是可解码的?你确定你没有把编码和加密搞混? – BalusC

+0

我只是想不直接显示网址。我知道这可能会有潜在的安全漏洞,但我的应用程序需要这样做。我认为它可以被解码。谢谢您的帮助。 – user1722908

回答

1

所以实际上你希望URL变得有些不可读,不需要解码,Base64编码需要解码(替换/-)。

是的,你可能会滥用URL编码。

String encodeURL(String s) { 
    byte[] bytes = s.getBytes("UTF-8"); 
    StringBuilder sb = new StringBuilder(); 
    for (byte b : bytes) { 
     String hex = String.format("%%%02X", ((int)b) & 0xFF); 
     sb.append(hex); 
    } 
    return sb.toString(); 
} 

%%是百分号本身,和%02X十六进制,2个位数,零填充,首都。

请注意,某些浏览器会在鼠标悬停时显示解码的链接。但你只是重定向。

+0

感谢您的帮助。这种方法工作得很好! – user1722908