这类url的问题在于它们是部分编码的,如果您尝试使用开箱即用的编码器,它将始终对整个字符串进行编码,因此我想您使用自定义编码器的方法是正确的。您的代码还可以,您只需要添加一些验证,例如,如果“
evil url”不随协议部分一起提供(即没有“ https://”),除非您非常确定,该怎么办?它永远不会发生。
我有一些空闲时间,所以我做了一个替代的自定义编码器,我遵循的策略是解析URL中不允许的字符并仅对那些字符进行编码,而不是尝试重新编码整个内容:
private static String enpreSemiEnpred(String semiEncondedUrl) { final String ALLOWED_CHAR = "!*'();:@&=+$,/?#[]-_.~"; StringBuilder enpred = new StringBuilder(); for(char ch: semiEncondedUrl.toCharArray()) { boolean shouldEnpre = ALLOWED_CHAR.indexOf(ch) == -1 && !Character.isLetterOrDigit(ch) || ch > 127; if(shouldEnpre) { enpred.append(String.format("%%%02X", (int)ch)); } else { enpred.append(ch); } } return enpred.toString();}
希望这可以帮助
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)