【问题标题】:How to create a cookie and use it in HttpURLConnection?如何创建 cookie 并在 HttpURLConnection 中使用它?
【发布时间】:2019-09-26 22:23:30
【问题描述】:

我有以下 python 代码,它创建一个 cookie 并将其添加到会话中。使用 HttpURLConnection 的等效 java 代码是什么?我基本上想使用生成的 cookie 进行 HTTP POST 请求。

    session = requests.session()
    session.auth = (username, password)
    try:
        token = session.get(SITEMINDER_URL % server, verify=False)
        session.cookies.update(dict(SMSESSION=json.loads(token.content)['SMSESSION']))
    except Exception as ex:
        raise Exception("Failed in authenticating with siteminder", ex)
    response = session.post(api_url, headers=headers, verify=False, json=data)

【问题讨论】:

    标签: java cookies httpurlconnection siteminder


    【解决方案1】:

    你会使用这样的东西:

    HttpURLConnection httpconn = < some source to get a HttpURLConnection >;
    String cookieName = "SMSESSION"; // note this is the default but SM can use other prefixes
    String cookieValue = < your token content >;
    httpurl.setRequestProperty("Cookie", cookieName + "=" + cookieValue);
    

    此外,来自 javadocs:注意:HTTP 要求所有可以合法地具有多个具有相同键的实例的请求属性使用逗号分隔的列表语法,该语法允许将多个属性附加到单个属性中

    这让我指出直接使用 HttpUrlConnection 真的很笨拙。我建议您查看 HTTP 客户端库,例如 Apache HTTP Client http://hc.apache.org/httpcomponents-client-ga/

    【讨论】:

    • 非常感谢您的回复!我如何使用 siteminder url 在 java 中实际生成令牌内容。正如您在我的问题中的 python 代码中看到的那样,它是在以下两行中生成的:token = session.get(SITEMINDER_URL % server, verify=False) session.cookies.update(dict(SMSESSION=json.loads(token.content)['SMSESSION']))
    • 我对python代码不熟悉。登录 SiteMinder 的方式有很多种 - HTTP Basic、基于表单的登录等,具体取决于您的站点的配置方式
    【解决方案2】:

    在我看来,您可以创建一个 HttpUrlConnection 对象,分配一个 List 的 Cookie,如下所示:

    List<String> cookies = new ArrayList<>();
    //Or using a map With entries: Key and value for each cookie
    cookies.add("User-Agent=MyUserAgent"); //etc...
    URL site = new URL("https://myurl.com");
    HttpsURLConnection conn = (HttpsURLConnection) site.openConnection();
    for (String string: cookies) {
            conn.setRequestProperty("Cookie", string);
    }
    

    然而,这是最简单但不是最好的方法。

    【讨论】:

      【解决方案3】:

      要获得 Cookie 的更高抽象,请使用 CookieManager 和 CookieStore 类。这是一个例子:

      HttpURLConnection connection
      CookieManager cookieManager = new CookieManager();
      HttpCookie cookie = new HttpCookie("cookieName","cookieValue");
      
      cookieManager.getCookieStore().add(null,cookie);
      
      connection.setRequestProperty("Cookie", String.join( ";", cookieManager.getCookieStore().getCookies()));  
      

      【讨论】:

        【解决方案4】:

        试试这个:

            URL url = new URL("http://www.example.com");
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        
            conn.setRequestProperty("Cookie", "name1=value1; name2=value2");
        
            conn.connect();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-04
          • 2018-06-01
          • 2012-09-03
          • 1970-01-01
          • 2013-04-15
          • 2014-01-04
          • 2019-08-11
          相关资源
          最近更新 更多