1

我試圖打一個URL(登錄屏幕),獲取jsessionid(J2EEJSESSIONID)並將其添加到cookie存儲中,然後轉到上下文並使用憑據訪問相同的URL。我期待登錄成功的屏幕。 但是我再次登錄屏幕反彈。 而且,我打印了兩個匹配的響應頭。我期待着同一個J2EESESSIONID的響應來維持會話。相反,兩個會話ID都是不同的。請幫助。爲什麼httpclient爲每個請求刷新jsession id?

請找到下面的代碼:

HttpEntity entity = null; 
    DefaultHttpClient httpClient = new DefaultHttpClient(); 
    try{ 

     // Initialization 
     HttpPost httpPost = new HttpPost("https://yyyyy.xxx.com/enl"); 
     HttpClientExample httpClientExample = new HttpClientExample(); 
     CookieStore cookieStore = new BasicCookieStore(); 
     HttpContext httpContext = new BasicHttpContext(); 
     httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 
     HttpGet httpGet = new HttpGet("https://yyyyy.xxx.com/enl"); 

     // Execute Get 
     HttpResponse httpResponse = httpClient.execute(httpGet, httpContext); 

     // Print the header for 1st url 
     org.apache.http.Header[] headers = httpResponse.getAllHeaders(); 
     System.out.println("##### Header length::"+headers.length); 
     for(int i=0;i<headers.length; i++) 
     { 
      System.out.println("Header Name::"+headers[i].getName()); 
      System.out.println("Header Val::"+headers[i].getValue()); 
     } 

     // update Cookie for the next hit 
     org.apache.http.Header[] cookieHeaders = httpResponse.getHeaders("Set-Cookie"); 
     String html = EntityUtils.toString(httpResponse.getEntity()); 
     cookieStore = httpClientExample.updateCookieStore(cookieHeaders, cookieStore); 
     httpClient.setCookieStore(cookieStore); 
     httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

     // Setting the redirects since i received 302 error 
     httpClient.setRedirectStrategy(new DefaultRedirectStrategy() {     
      public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) { 
       boolean isRedirect=false; 
       try { 
        isRedirect = super.isRedirected(request, response, context); 
       } catch (ProtocolException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       if (!isRedirect) { 
        int responseCode = response.getStatusLine().getStatusCode(); 
        if (responseCode == 301 || responseCode == 302) { 
         return true; 
        } 
       } 
       return false; 
      } 
     }); 

     // Added because i received Circular redirect error 
     httpClient.getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, true); 

     // Execute Post with credentials 
     httpClient.getCredentialsProvider().setCredentials(
       new AuthScope("http://yyyyy.xxx.com", 443), 
       new UsernamePasswordCredentials("usr", "pswd")); 
     httpPost.setHeader("Cookie", "JSESSIONID="+ getSessionId(cookieHeaders)); 
     HttpResponse response = httpClient.execute(httpPost, httpContext); 


     // Print the response 
     entity = response.getEntity(); 
     InputStream content1 = (InputStream)entity.getContent(); 
     System.out.println("############### 2nd #####################"+response.getStatusLine().getStatusCode()); 
     BufferedReader in1 = 
      new BufferedReader (new InputStreamReader (content1)); 
     String line1; 
     while ((line1 = in1.readLine()) != null) { 
      System.out.println(line1); 
     } 

     // Print the header for 2nd url 
     org.apache.http.Header[] headers1 = response.getAllHeaders(); 
     System.out.println("##### Header length 2 ::"+headers1.length); 
     for(int i=0;i<headers1.length; i++) 
     { 
      System.out.println("Header Name 2 ::"+headers1[i].getName()); 
      System.out.println("Header Val 2 ::"+headers1[i].getValue()); 
     } 



    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    finally{ 

     try { 
      EntityUtils.consume(entity); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     httpClient.getConnectionManager().shutdown(); 
    } 
} 

private static String getSessionId(org.apache.http.Header[] headers) { 
    // TODO Auto-generated method stub 

    for(int i=0;i<headers.length; i++) 
    { 
     String str = headers[i].getValue(); 
     String[] strArray = str.split("="); 
     String[] cookieValueArray = strArray[1].split(";"); 
     System.out.println(strArray[0]+"|"+cookieValueArray[0]); 
     if(strArray[0].startsWith("J2EEJSESSION")) 
     { 
      System.out.println("cookieValueArray[0]:"+cookieValueArray[0]); 
      return cookieValueArray[0]; 
     } 

    } 
    return null; 
} 

protected CookieStore updateCookieStore(org.apache.http.Header[] headers, CookieStore cookieStore) 
{ 
    for(int i=0;i<headers.length; i++) 
    { 
     String str = headers[i].getValue(); 
     String[] strArray = str.split("="); 
     String[] cookieValueArray = strArray[1].split(";"); 
     System.out.println(strArray[0]+"|"+cookieValueArray[0]); 
     BasicClientCookie cookie = new BasicClientCookie(strArray[0], "A"+cookieValueArray[0]); 
     /*if(strArray[0].startsWith("J2EEJSESSION")) 
     { 
      cookie.setDomain("yyyyy.xxx.com"); 
     } 
     else 
     { 
      cookie.setDomain(".xxx.com"); 
     }*/ 

     cookie.setDomain(".xxx.com"); 
     cookie.setPath("/"); 
     cookieStore.addCookie(cookie); 
     if(strArray[0].startsWith("J2EEJSESSION")) 
     { 
      BasicClientCookie cookie1 = new BasicClientCookie("JSESSIONID", "A"+cookieValueArray[0]); 
      cookie1.setDomain(".xxx.com"); 
      cookie1.setPath("/"); 
      cookieStore.addCookie(cookie1); 
     } 
    } 
    return cookieStore; 
} 

另一種看法: 當我從下面的代碼片段刪除「A」 CONCAT,我沒有得到J2EESESSIONID在第二擊:

BasicClientCookie cookie = new BasicClientCookie(strArray [0],「A」+ cookieValueArray [0]);

回答

1

發現在同一天我張貼了這個問題的答案..共享思想.. 答案是非常簡單的。對於某些原因認證沒有成功,因此新的JSESSIONID創建。用「BasicNameValuePair」代替「httpClient.getCredentialsProvider()。setCredentials()」,它工作:)

相關問題