Java:url编码';允许';字符完整

Java:url编码';允许';字符完整,java,url,encoding,urlencode,Java,Url,Encoding,Urlencode,来自Java新手的简单问题。 我想对url进行编码,以便将非标准字符转换为十六进制值(即%XX),而url中的字符(字母、数字、斜杠、问号等)将保持不变 例如,编码 "hi/hello?who=moris\\boris" 结果应该是 "hi/hello?who=moris%5cboris" 想法?使用URLEncoder.encode(url,“UTF-8”),请参阅。OWASP企业安全API为此提供了解决方案 请访问以下链接了解更多详细信息 您可以使用下面的命令来转义URL中的特殊字符。

来自Java新手的简单问题。 我想对url进行编码,以便将非标准字符转换为十六进制值(即%XX),而url中的字符(字母、数字、斜杠、问号等)将保持不变

例如,编码

"hi/hello?who=moris\\boris"
结果应该是

"hi/hello?who=moris%5cboris"

想法?

使用
URLEncoder.encode(url,“UTF-8”)
,请参阅。

OWASP企业安全API为此提供了解决方案

请访问以下链接了解更多详细信息


您可以使用下面的命令来转义URL中的特殊字符。但是,您只需要传递值,而不需要传递整个url

public static String escapeSpecialCharacters(String input) {
        StringBuilder resultStr = new StringBuilder();
        for (char ch : input.toCharArray()) {
            if (isSafe(ch)) {
                resultStr.append(ch);
            } else{
                resultStr.append('%');
                resultStr.append(toHex(ch / 16));
                resultStr.append(toHex(ch % 16));                   
            }
        }

        return resultStr.toString();
    }

    private static char toHex(int ch) {
        return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10);
    }

    private static boolean isSafe(char ch) {
    return ((ch>='A' && ch<='Z') || (ch>='a' && ch<='z') || (ch>='0' && ch<='9') || "-_.~".indexOf(ch)>=0); 
}
公共静态字符串转义特殊字符(字符串输入){
StringBuilder resultStr=新建StringBuilder();
for(char ch:input.toCharArray()){
if(isSafe(ch)){
结果追加(ch);
}否则{
结果tr.append('%');
结果tr.append(toHex(ch/16));
结果tr.append(toHex(ch%16));
}
}
返回resultStr.toString();
}
私有静态字符到十六进制(int-ch){
返回(字符)(ch<10?'0'+ch:A'+ch-10);
}
私有静态布尔isSafe(字符ch){
返回((ch>='A'&&ch='A'&&ch='0'&&ch=0);
}

这实际上是一个相当棘手的问题。之所以棘手,是因为URL的不同部分需要进行不同的处理(编码)

根据我的经验,最好的方法是使用url或URI类从其组件组装url,让它们正确编码组件



事实上,现在我想起来了,在组装组件之前,您必须对组件进行编码。一旦组装了组件,就无法判断(例如)是将“?”用于查询分隔符(不要转义)还是路径名组件中的字符(转义).

org.apache.commons.codec.net.URLCodec将对特殊字符进行编码(如您所示的\等)。但是,您可能需要拆分url,因为您不希望路径中的字符被编码。此外,您还需要拆分参数名称和值,因为?&和=需要保持完整,才能单独传递参数,而不是作为一个巨大的参数名称。

您可以尝试spring UriUtils。这似乎是在处理URL正确编码/解码URL的适当部分


不起作用,它还会转换“特殊字符”允许在url中使用-如前向slashse和问号marksOh,我明白了。您需要做的只是对url中要编码的部分进行url编码。您可以只对参数进行编码吗?url编码器用于HTML表单编码,而不是url。但是,我同意命名非常糟糕。(参见javadoc)例如,空间被转换为+where,因为URL应该是%20。正如其他海报所建议的,您需要将URL分解为其组件,并仅对那些不需要改变包含URL的结构的组件进行编码。URLEncoder不会解决此问题。下面的答案提供了一个更可靠的解决方案省略了很多不安全的字符。枚举安全字符更容易:
a-z a-z 0-9-.~
知道如何在给定整个url的情况下只解析可能包含需要编码的非法字符的值吗?我不认为有,因为无法确定非法字符是url本身的一部分还是参数的一部分需要转义的值。@unreputable表示
~
不安全,但会列出您未列出的其他安全字符:«安全字符字母数字[
0-9a-zA-Z
],特殊字符
$-.+!*'(),
»我不确定这是不可能的。也许,定义得不好。毕竟,如果web浏览器需要下载以“未编码”绝对形式提供的资源,他们就可以做到这一点。@rOu1i-当我说不可能时,我真正的意思是“100%保证正确性的不可能”。web浏览器要做的是将一系列启发式应用于(嗯)用户键入的“web地址”,并对语法明显不正确的组件进行编码。这在所有情况下都不起作用。java.net.URL和java.net.URI不编码查询参数。例如,新的java.net.URI(“http”,“www.foo.com”,“/bar”,“param1=value1¶m2=results in”