How to set Cookies at Http Get method using Java

前端 未结 3 1528
青春惊慌失措
青春惊慌失措 2020-12-01 16:09

I want to do a manual GET with cookies in order to download and parse a web page. I need to extract the security token, in order to make a post at the forum. I have complete

相关标签:
3条回答
  • 2020-12-01 16:53

    To be sure, you should be gathering the cookies from the response's Set-Cookie headers. To send them back in the subsequent requests, you should set them one by one using URLConnection#addRequestProperty().

    Basically:

    // ...
    
    // Grab Set-Cookie headers:
    List<String> cookies = connection.getHeaderFields().get("Set-Cookie");
    
    // ...
    
    // Send them back in subsequent requests:
    for (String cookie : cookies) {
        connection.addRequestProperty("Cookie", cookie.split(";", 2)[0]);
    }
    
    // ...
    

    The split(";", 2) is there to get rid of cookie attributes which are irrelevant for the server side like expires, path, etc.

    For a more convenienced HTTP client I'd suggest to have a look at Apache HttpComponents Client. It can handle all the cookie stuff more transparently.

    See also:

    • How to use URLConnection?

    Update: as per the comments, this is not a cookie problem. A wrong request token means that the server has CSRF/bot prevention builtin (to prevent people like you). You need to extract the token as a hidden input field from the requested page with the form and resend it as a request parameter. Jsoup may be useful to extract all (hidden) input fields. Don't forget to pass the name-value pair of the button as well which you'd like to "press" programmatically. Also see the abovementioned link for more hints.

    In the future, you should really be more clear about the exact error you retrieve and not guess something in the wild. Copypaste the exact error message and so on.

    0 讨论(0)
  • 2020-12-01 17:01

    Assuming the cookie values are not hard-coded but obtained from a previous request, it's probably easiest to use the CookieHandler class.

    CookieHandler.setDefault(new CookieManager());
    

    Then your HttpURLConnection will automatically save any cookies it receives and send them back with the next request to the same host.

    0 讨论(0)
  • 2020-12-01 17:08
    // Grab Set-Cookie headers:
    List<String> cookies = connection.getHeaderFields().get("Set-Cookie");
    
    // ...
    
    // Send them back in subsequent requests:
    for (String cookie : cookies) {
        connection.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
    }
    

    Above code will work for sending multiple cookies just use setRequestProperty instead of addRequestProperty. The working code is:

    // Grab Set-Cookie headers:
    List<String> cookies = connection.getHeaderFields().get("Set-Cookie");
    
    // ...
    
    // Send them back in subsequent requests:
    for (String cookie : cookies) {
        connection.setRequestProperty("Cookie", cookie.split(";", 1)[0]);
    }
    
    0 讨论(0)
提交回复
热议问题