用Java编码字符串URL
我在下面有一段代码,在通过电线(电子邮件)发送URL之前对其进行编码: 问题是生成的电子邮件如下所示:用Java编码字符串URL,java,Java,我在下面有一段代码,在通过电线(电子邮件)发送URL之前对其进行编码: 问题是生成的电子邮件如下所示: http://127.0.0.1:8888/index.html%3Fgwt.codesvr=127.0.0.1:9997%23ConfirmRegisterPage;?code=fdc12e195d&email=demo@email.com ?标记和#符号将替换为%3F和%23,当从浏览器打开链接时,链接不会打开,因为链接不正确 正确的方法是什么?您可以使用Java API方法。使
http://127.0.0.1:8888/index.html%3Fgwt.codesvr=127.0.0.1:9997%23ConfirmRegisterPage;?code=fdc12e195d&email=demo@email.com
?
标记和#
符号将替换为%3F
和%23
,当从浏览器打开链接时,链接不会打开,因为链接不正确
正确的方法是什么?您可以使用Java API方法。使用方法对查询参数进行编码
更好的API是。您需要组合url的查询部分,并添加片段作为正确的参数 像这样的方法应该会奏效:
private static String urlFor(HttpServletRequest request, String code, String email, boolean forgot) {
try {
URI htmlLink = new URI(createHtmlLink());
String query = htmlLink.getQuery();
String fragment = htmlLink.getFragment();
fragment += "code="+code+"&email="+email;
if(forgot){
fragment += "&forgot=true";
}
URI url = new URI(request.getScheme(), null, request.getServerName(), request.getServerPort(), htmlLink.getPath(),
query, fragment);
String s = url.toString();
return s;
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
只对查询参数进行编码,而不是对路径分段进行编码。谢谢,我刚刚尝试了您的代码,但输出结果如下:
http://127.0.0.1:8888/index.html?gwt.codesvr=127.0.0.1:9997&code=4522ebee9f&email=demo@email.com#ConfirmRegisterPage代码>应该是http://127.0.0.1:8888/index.html?gwt.codesvr=127.0.0.1:9997#ConfirmRegisterPage;&代码=4522ebee9f和电子邮件=demo@email.com
@xybrek:你百分之百确定吗?我90%确定“&code=…&email=…”应该放在查询部分,而不是片段部分,但是如果您确定,只需将“&code…”附加到htmlink.getFragment()而不是htmlink.getQuery()。是的。。。根据勘误表文档:很好。我已经更新了代码以适应该输出(我假设您的意思是“#ConfirmRegisterPage;code=45…”而不是“#ConfirmRegisterPage;&code=45…”)。
private static String urlFor(HttpServletRequest request, String code, String email, boolean forgot) {
try {
URI htmlLink = new URI(createHtmlLink());
String query = htmlLink.getQuery();
String fragment = htmlLink.getFragment();
fragment += "code="+code+"&email="+email;
if(forgot){
fragment += "&forgot=true";
}
URI url = new URI(request.getScheme(), null, request.getServerName(), request.getServerPort(), htmlLink.getPath(),
query, fragment);
String s = url.toString();
return s;
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}