【问题标题】:How to extract query string from a URL of a web-page using java如何使用java从网页的URL中提取查询字符串
【发布时间】:2012-03-16 06:15:00
【问题描述】:

从 OathCallBack 页面中的以下 URL,我想使用 Java 提取 access_token 和 token_type。知道怎么做吗?

http://myserver.com/OathCallBack#state=/profile&access_token=ya29.AHES6ZQLqtYrPKuw2pMzURJtWuvINspm8-Vf5x-MZ5YzqVy5&token_type=Bearer&expires_in=3600

我尝试了以下方法,但无法提取所需信息。

{
    String scheme = req.getScheme();             // http
    String serverName = req.getServerName();     // myserver.com
    int serverPort = req.getServerPort();        // 80
    String contextPath = req.getContextPath();   
    String servletPath = req.getServletPath();   
    String pathInfo = req.getPathInfo();         // return null and exception
    String queryString = req.getQueryString();    // return null

}

我要编辑我的问题

感谢大家的精彩回复,

谷歌做到了,

您可以通过 URL 引用该链接

http://developers.google.com/accounts/docs/OAuth2Login

上面的网址页面有以下链接

http://accounts.google.com/o/oauth2/auth?范围=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww‌​.googleapis.com%2Fauth%2Fuserinfo.profile& state=%2Fprofile& redirect_uri=https%3A%2F% 2Foauth2-login-demo.appspot.com%2Foauthcallback& response_type=token& client_id=812741506391.apps.googleusercontent.com

当您点击上面的链接时,您将获得您的 gmail 登录帐户 access_token,并且该令牌在#sign 之后

【问题讨论】:

  • 在 URL 中的 "?" 位置是“#”,因此查询字符串不会被提取,如果我能够读取/获取字符串中的整个 URL,它将被提取,如何读取包括所有内容的完整 URL,例如 access_token
  • 你试过req.getRequestURL()
  • req.getRequestURL() 仅检索 myserver.com/OathCallBack 并没有其他内容,但我对其他参数感兴趣,例如 access_token 等
  • 我编辑了原始问题,请参考

标签: java google-app-engine url web query-string


【解决方案1】:

某些字符不能成为 URL 的一部分(例如空格),而某些其他字符在 URL 中具有特殊含义:例如,字符 # 可用于进一步指定一个小节(或片段)文档;字符 = 用于分隔名称和值。

更多信息请参见http://en.wikipedia.org/wiki/Query_string

【讨论】:

    【解决方案2】:

    看起来“#”应该是“?”。

    在普通 URL 中,参数作为键值对在“?”之后传递以及使用“&”链接在一起的多个参数。 URL 可能如下所示:

    http://someserver.com/somedir/somepage.html?param1=value1&param2=value2&param3=value3.

    通常,Java servlet 容器会返回 '?' 之后的所有内容。当调用 getQueryString() 但由于缺少“?”它返回 null。

    正如@Sandeep Nair 所建议的,getRequestURL() 应该将这个完整的 URL 返回给您,您可以使用正则表达式对其进行解析以获取您想要的信息。可能使用的正则表达式如下:

    (?<=access_token=)[a-zA-Z0-9.-]*
    

    但是,getRequestURL() 通常不会返回查询字符串,因此使用此方法依赖于存在“#”而不是“?”这一事实。因此可能不是一个很好的解决方案。见here

    我建议你找出为什么你得到一个“#”而不是一个“?”并尝试更改此设置,如果您可以这样做,则 servlet 容器应为您管理 URL 参数并调用 request.getAttribute("access_token") 和 request.getAttribute("token_type") (请参阅here)将两个值都作为字符串返回。

    【讨论】:

      【解决方案3】:

      您通过调用获取查询字符串 String queryString = req.getQueryString();

      在您的情况下它正确返回 null,因为没有查询字符串。 “#”后面的字符是anchor规范,只对浏览器可见,不发送到服务器。

      【讨论】:

        猜你喜欢
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 2015-02-08
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多