2013-04-08 69 views
4

我嘗試使用Apache HttpClient以表單發送cookie,並且出於某種原因,服務器獲取請求但不是cookie。這裏是我的代碼:Java - 爲什麼HttpClient不發送我的cookies?

  DefaultHttpClient client = new DefaultHttpClient(); 

      // Set the cookies... 
      { 
       String Domain = MyGetParameter("Domain"); 
       BasicCookieStore cookieStore = new BasicCookieStore(); 
       String[] strs = GetParameterSplitted("PostCookies"); 
       int size = strs.length; 
       for (int i=0; i<size-1; i+=2) 
       { 
        //JOptionPane.showMessageDialog(null, strs[i]+" = "+FromBase64(strs[i+1], "UTF-8")); 
        BasicClientCookie cookie = new BasicClientCookie(strs[i], FromBase64(strs[i+1], "UTF-8")); 
        cookie.setDomain(Domain); 
        cookie.setPath("/"); 
        //cookie.setSecure(true); 
        cookieStore.addCookie(cookie); 
       } 
       client.setCookieStore(cookieStore); 
      } 

      HttpPost post = new HttpPost(url.toURI()); 
      ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(10); 
      // Set the form POST parameters... 
      { 
       String[] strs = GetParameterSplitted("PostParams"); 
       int size = strs.length; 
       for(int i=0; i<size-1; i+=2) 
       { 
        String name = strs[i].trim(); 
        String value = FromBase64(strs[i+1].trim(), "UTF-8");//, "UTF-8" 

        nameValuePairs.add(new BasicNameValuePair(name, value)); 
       } 
      } 
      post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      post.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 
      post.getParams().setParameter(ClientPNames.COOKIE_POLICY, org.apache.http.client.params.CookiePolicy.BROWSER_COMPATIBILITY); 

      HttpResponse response = client.execute(post); 
      int StatusCode = response.getStatusLine().getStatusCode(); 

該網站使用HTTP(不是HTTPS),我要確保域名正確設置爲餅乾(http://mysite)和餅乾似乎上面的代碼執行時要正確設置。

有沒有人有任何想法,爲什麼它沒有通過他們到服務器? 我在這個網站上看到過其他類似的問題,但似乎沒有任何幫助。

+1

確實來自您發送完全相同的域名的cookies?例如'http:// stackoverflow.com'和'http:// www.stackoverflow.com'是不同的域。 – ddmps 2013-04-08 10:28:08

+0

是的。實際上,如果POST URL不同,我認爲請求不會到達服務器。我在本地調試該站點。 我將Cookie域設置爲'http:// mysite',並將表單發佈到'mysite/blah/blah'。我不認爲'http://'部分扮演什麼角色,是嗎? – user2173353 2013-04-08 10:40:10

+0

我是否需要設置路徑:'cookie.setPath(「/ blah/blah」);'? – user2173353 2013-04-08 10:52:20

回答

15

仔細一看,如果您的cookie的日期過期了httptClient不發送此cookie,則應在此放置cookie日期。

而在域名中將沒有「http://」,只是簡單的域名。

對於實施例:(http://www.gmail.com =>這樣寫setDomain( 「www.gmail.com」

這個例子中我加100天至當前日期和設置的cookie。 例如,通過HttpClient的發送POST數據與餅乾:

Calendar calendar = Calendar.getInstance(); 
calendar.add(Calendar.DAY_OF_YEAR, 100); 
Date date = calendar.getTime(); 

DefaultHttpClient httpClient = new DefaultHttpClient(); 
httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY,CookiePolicy.BROWSER_COMPATIBILITY); 
httpClient.setCookieStore(new BasicCookieStore()); 
BasicClientCookie cookie = new BasicClientCookie(YourCookieName, YourCookieValue); 
cookie.setDomain(YourDomain); 
cookie.setExpiryDate(date); 
cookie.setPath("/"); 
httpClient.getCookieStore().addCookie(cookie); 

.... 

httpClient.execute(yourHttpUriRequest); 
+0

哈!就是這樣! 它是Cookie域中的'http://',使事情失敗... 謝謝。 – user2173353 2013-04-08 11:03:20

+0

男人你救了我的命,奮鬥了12個小時,發現我在域名中包含https://。 – Guanlun 2014-01-26 07:47:37

+0

謝謝@Guanlun,我很高興我的問題對你有幫助 – 2014-01-27 04:05:17

相關問題