2014-09-24 102 views
0

我有一个格式为https://stackexchange.com/oauth/login_success#access_token=token&expires=5678的重定向URI。我想从这个URL获取acces令牌。尝试以下方法从url中获取“#”后的参数java

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. 

任何直接的方法?请帮助

+0

你可以得到indexOf'#'然后创建一个子串出邮件uri字符串 – 2014-09-24 06:52:40

+0

任何其他方法pls? – deniz 2014-09-24 06:54:51

+0

'getFragment()'_is_是最好的方法。认为'#'后面的所有内容(通过URL/URI)都是一个很大的值。如果它被分隔或具有特殊的编码,则取决于应用程序(在这种情况下,您)处理。 – 2014-09-24 06:55:04

回答

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

你可以用正则表达式

str.split("#|&|=") 

使用字符串方法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 
0

简单而优雅的解决方案,可以得到你想要的值:

public HashMap<String, String> parseUrlFragment (String url) { 

    HashMap<String, String> output = new HashMap<>(); 

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

    for (String key : keys) { 

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

    } 

    return output; 

} 

它使用HashMap来代表的数值,所以它的输出:

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

data.get ("access_token") -> token 
data.get ("expires") -> 5678