【问题标题】:Subsequent HTTPS POST request in Java with cookies retained保留 cookie 的 Java 中的后续 HTTPS POST 请求
【发布时间】:2015-12-12 00:26:52
【问题描述】:

我需要获取 HTTPS URL 的输入流,例如。 https://baseurl.com/mypdfgenerated.php?param=somevalue。为了访问这个 URL,我需要通过提供 BODY 参数来访问登录页面(例如https://baseurl.com/login.php):

user_name, web_pwd and submit_login 

我假设成功访问第一个 URL 的唯一方法是通过 POST 到 /login.php,然后存储 cookie,然后在下一个 GET 请求中重用 cookie-session-ID;如果这是正确的方法,那么有人可以与正确/最近的库分享解决方案吗?

【问题讨论】:

标签: java post cookies


【解决方案1】:

不确定哪个是最好的方法,但帮助我实现这一目标的是 CloseableHttpClient 类,它与 BasicCookieStore 一起为登录后的后续请求保留 cookie,实现如下:

BasicCookieStore cookieStore = new BasicCookieStore(); 
CloseableHttpClient httpclient = HttpClients.custom().setDefaultCookieStore(cookieStore).build(); 
HttpUriRequest login = RequestBuilder.post()
                    .setUri(new URI(url_login))
                    .addParameter("login", "loginuname")
                    .addParameter("password", "pwd")
                    .addParameter("submit", "sub_mit");
CloseableHttpResponse response = httpclient.execute(login);
List<Cookie> cookies = cookieStore.getCookies();
response.close();

HttpGet httpget2 = new HttpGet(url_to_get_after_login);
CloseableHttpResponse response2 = httpclient.execute(httpget2);
response2.close();

【讨论】:

    【解决方案2】:

    来自Java Samples的示例代码sn-p

    try { 
        System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
        java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); 
        URL url = new URL("https://www.yourwebsite.com/"); // Some URL
        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setDoInput(true); 
        connection.setDoOutput(true);
        connection.setRequestMethod("POST"); 
        connection.setFollowRedirects(true); 
        String query = "UserID=" + URLEncoder.encode("username"); 
        query += "&"; 
        query += "password=" + URLEncoder.encode("password"); 
        query += "&"; 
        // open up the output stream of the connection 
        DataOutputStream output = new DataOutputStream( connection.getOutputStream() ); 
        // write out the data 
        output.writeBytes( query ); 
    }catch(Exception err){
        err.printStackTrace();
    }
    

    看看Usage of cookies

    【讨论】:

    【解决方案3】:

    您应该使用为您处理 cookie 的库,例如 Apache HTTPClient

    【讨论】:

      猜你喜欢
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 2018-08-21
      • 2023-04-08
      • 2013-05-30
      • 2011-08-16
      • 1970-01-01
      相关资源
      最近更新 更多