1

URL(ログイン画面)にアクセスし、jsessionid(J2EEJSESSIONID)を取得してCookieストアに追加し、コンテキストに追加して、資格情報で同じURLにアクセスしようとしています。ログイン成功画面が表示されることを期待しています。ただし、ログイン画面で再びバウンスされます。そして、両方のヒットの応答ヘッダーを出力しました。セッションを維持するために、同じ J2EESESSIONID を持つ両方の応答を期待しています。代わりに、両方のセッション 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" 連結を削除すると、2 番目のヒットで J2EESESSIONID が取得されません。

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

4

1 に答える 1

1

この質問を投稿した同じ日に回答を見つけました..共有を考えました..答えは非常に簡単です..何らかの理由で認証が成功しなかったため、新しいjsessionIdが作成されました. 「httpClient.getCredentialsProvider().setCredentials()」を「BasicNameValuePair」に置き換え、機能しました:)

于 2013-03-27T20:53:59.373 に答える