用Java编码字符串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方法。使

我在下面有一段代码,在通过电线(电子邮件)发送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方法。使用方法对查询参数进行编码


更好的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);
    }
}