简体   繁体   English

用Java在HttpURLConnection中设置cookie的时间是什么时候?

[英]When is the cookie set in HttpURLConnection with Java?

look at these code: 看看这些代码:

public static String get(String url, Properties parameters) throws MalformedURLException, IOException{
        url = buldGetUrl(url, parameters);
        if(DEBUG) System.out.println("[HTTP GET REQUEST]");
        if(DEBUG) System.out.println(" URL: " + url);
        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
        conn.setRequestProperty("Cookie","JSESSIONID=" + J_SESSION_ID);
        conn.connect();

        if(DEBUG) System.out.println("\n[HTTP GET RESPONSE]");
        if(DEBUG) System.out.println("==== Response Headers =====");
        String serverCookies = conn.getHeaderField("Set-Cookie");
        if(serverCookies != null){
            String[] cookies = serverCookies.split(";");
            for(String s : cookies){
                s = s.trim();
                if(s.split("=")[0].equals("JSESSIONID")){
                    J_SESSION_ID = s.split("=")[1];
                    if(DEBUG) System.out.println(" Session ID Found: " + J_SESSION_ID);
                    break;
                }
            }
        }
        if(DEBUG){
            for(String s : conn.getHeaderFields().keySet()){
                if(s == null)
                    System.out.println(" " + conn.getHeaderField(s));
                else
                    System.out.println(" " + s + "=" + conn.getHeaderField(s));
            }
        }

        if(DEBUG) System.out.println("==== Response Content =====");
        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String str = null;
        StringBuilder sb = new StringBuilder();
        while ((str = br.readLine()) != null) {
            sb.append(str + System.getProperty("line.separator"));
            if(DEBUG) System.out.println(str);

        }
        br.close();
        return sb.toString();
    }

please notice these three lines: 请注意这三行:

HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();    
conn.setRequestProperty("Cookie","JSESSIONID=" + J_SESSION_ID);
conn.connect();

URL#openConnection and URL#connect , which method send the request to server? URL #openConnectionURL #connect ,哪个方法将请求发送到服务器? if the answer is openConnection method, how can a cookie be set after a request already been sent? 如果答案是openConnection方法,如何在请求已经发送后设置cookie? if the answer is connect method, you guess what ? 如果答案是连接方法,你猜怎么着? these code below works too, I can get response from server : 这些代码也可以,我可以从服务器获得响应:

url = buldGetUrl(url, parameters);
        if(DEBUG) System.out.println("[HTTP GET REQUEST]");
        if(DEBUG) System.out.println(" URL: " + url);
        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();

        if(DEBUG) System.out.println("\n[HTTP GET RESPONSE]");
        if(DEBUG) System.out.println("==== Response Headers =====");
        String serverCookies = conn.getHeaderField("Set-Cookie");
        if(serverCookies != null){
            String[] cookies = serverCookies.split(";");
            for(String s : cookies){
                s = s.trim();
                if(s.split("=")[0].equals("JSESSIONID")){
                    J_SESSION_ID = s.split("=")[1];
                    if(DEBUG) System.out.println(" Session ID Found: " + J_SESSION_ID);
                    break;
                }
            }
        }
        if(DEBUG){
            for(String s : conn.getHeaderFields().keySet()){
                if(s == null)
                    System.out.println(" " + conn.getHeaderField(s));
                else
                    System.out.println(" " + s + "=" + conn.getHeaderField(s));
            }
        }

        if(DEBUG) System.out.println("==== Response Content =====");
        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String str = null;
        StringBuilder sb = new StringBuilder();
        while ((str = br.readLine()) != null) {
            sb.append(str + System.getProperty("line.separator"));
            if(DEBUG) System.out.println(str);

        }
        br.close();
        return sb.toString();

The method connect() will Opens a communications link to the resource referenced by this URL, if such a connection has not already been established. 方法connect()将打开与此URL引用的资源的通信链接(如果尚未建立此连接)。 getInputStream(), getResponseCode(), or getResponseMessage() methods will create a communication link with server getInputStream(),getResponseCode()或getResponseMessage()方法将与服务器创建通信链接

So in general speaking, #connect() is in fact superfluous, whenever a method of this HttpURLConnection class, that is retrieving a response info (such as #getInputStream()/getResponseCode()/getHeaderFields()/etc.), is invoked, an implicit connect would actually be done. 所以一般来说,#connect()实际上是多余的,只要调用此HttpURLConnection类的方法,即检索响应信息(例如#getInputStream()/ getResponseCode()/ getHeaderFields()/ etc。),就会被调用,实际上会进行隐式连接。 Am I right? 我对吗?

My understanding is based on the below discussion: Using java.net.URLConnection to fire and handle HTTP requests 我的理解基于以下讨论: 使用java.net.URLConnection来触发和处理HTTP请求

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM