从URL中获取"#"后面的参数 Java

3

我有一个重定向uri的格式为https://stackexchange.com/oauth/login_success#access_token=token&expires=5678。我试图从这个url中获取访问令牌。尝试了以下方法:

uri.getQueryParameter("access_token"); //will return null since it is not a query param

uri.getFragment(); //will return "access_token=token&expires=5678" so i need to seperate it again.

有直接的方法吗?请帮忙。

你可以获取 # 的 indexOf 然后从邮件 URI 字符串中创建一个子字符串。 - Sagar Pilkhwal
还有其他的方法吗? - Deniz
1
getFragment() 是最好的方法。在 URL/URI 中,# 后面的所有内容都被视为一个大值。如果它有分隔符或特殊编码,那就由应用程序(在这种情况下是您)来处理。 - William Price
1
@deniz,没有其他自动知道该做什么的“神奇”方法。你必须编写代码。 - William Price
@PankajKumar,如果输入的URI可能包含自己的查询字符串,那么这是一个危险的假设。 - William Price
显示剩余3条评论
4个回答

3

有人可能会发现这很有帮助

   String queryAfterFragment = uri.getFragment();
   String dummy_url = "http://localhost?" + queryAfterFragment;
   Uri dummy_uri = Uri.parse(dummy_url);
   String access_token = dummy_uri.getQueryParameter("access_token");

使用起来非常顺畅且易于操作,之后感谢我吧 :-)


2

简单而优雅的解决方案,可以获取您想要的值:

public static Map<String, String> parseUrlFragment (String url) {

    Map<String, String> output = new LinkedHashMap<> ();

    String[] keys = url.split ("&");

    for (String key : keys) {

        String[] values = key.split ("=");
        output.put (values[0], (values.length > 1 ? values[1] : ""));

    }

    return output;

}

这段代码使用LinkedHashMap表示值,所以输出结果为:

Map<String, String> data = parseUrlFragment (uri.getFragment ());

data.get ("access_token") // token
data.get ("expires") // 5678

0

你可以尝试这种方式

String str = "https://stackexchange.com/oauth/
                             login_success#access_token=token&expires=5678";
int indexOfHash = str.indexOf("#");
// now you can substring from this
String subStr = str.substring(indexOfHash+1, str.length());
System.out.println(subStr);
// now you can substring from &
String sStr=subStr.substring(0,subStr.indexOf("&"));
System.out.println(sStr);
// now you can get token
String[] arr=sStr.split("=");
System.out.println(arr[0]);
System.out.println(arr[1]);

输出

access_token=token&expires=5678
access_token=token
access_token
token

0
你可以使用带有正则表达式的字符串方法split(String)。
str.split("#|&|=") 

这将根据传入的3个字符拆分字符串,并返回包含所有拆分部分的数组。

String s = 
    "https://stackexchange.com/oauth/login_success#access_token=token&expires=5678";
final String[] split = s.split("#|&|=");
for (String s1 : split) {
  System.out.println(s1);
}

输出:

https://stackexchange.com/oauth/login_success
access_token
token
expires
5678

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接