开发者

HttpClient 4, HTTP authentication fails OR session persistance problem

It seems that I am successfully logged in with my HttpClient, but any next HTTP request returns me back to the logon page.

My code is the following:

DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY); 

CookieStore cookieStore = new BasicCookieStore(); 
HttpContext client_context = new BasicHttpContext(); 
client_context.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

httpclient.setRedirectStrategy(new DefaultRedirectStrategy() { 
    // this is necessary to automatically redirect if new URL is defined in the responce body
    @Override 
    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 isRedirect; 
    } 
}); 

HttpPost login = new HttpPost("http://localhost:8080/web/j_spring_security_check"); 
HttpParams param = new BasicHttpParams(); 
param.setParameter("j_username", "me"); 
param.setParameter("j_password", "p"); 
login.setParams(param); 

HttpResponse response = httpclient.execute(targetHost, login, client_context);
...
... 

and it produces the next log:

1  [org.apache.http.impl.conn.DefaultClientConnection] Sending request: POST /web/j_spring_security_check HTTP/1.1 
2  [org.apache.http.headers] >> POST /web/j_spring_security_check HTTP/1.1 
3  [org.apache.http.headers] >> Content-Length: 0 
4  [org.apache.http.headers] >> Host: localhost:8080 
5  [org.apache.http.headers] >> Connection: Keep-Alive 
6  [org.apache.http.headers] >> User-Agent: Apache-HttpClient/4.1.2 (java 1.5) 
7  [org.apache.http.impl.conn.DefaultClientConnection] Receiving response: HTTP/1.1 302 Moved Temporarily 
8  [org.apache.http.headers] << HTTP/1.1 302 Moved Temporarily 
9  [org.apache.http.headers] << Server: Apache-Coyote/1.1 
10 [org.apache.http.headers] << Set-Cookie: JSESSIONID=7FDB4CC310A8784A3DE7B5D9370D124D; Path=/web 
11 [org.apache.http.headers] << Location: http://localhost:8080/web/application.html;jsessionid=7FDB4CC310A8784A3DE7B5D9370D124D 
12 [org.apache.http.headers] << Content-Length: 0 
13 [org.apache.http.headers] << Date: Thu, 01 Sep 2011 17:35:49 GMT 
14 [org.apache.http.client.protocol.ResponseProcessCookies] Cookie accepted: "[version: 0][name: JSESSIONID][value: 7FDB4CC310A8784A3DE7B5D9370D124D][domain: localhost][path: /web][expiry: null]".  
15 开发者_如何学Python[org.apache.http.impl.client.DefaultHttpClient] Connection can be kept alive indefinitely 
16 [temp.LoginTest$1] Redirect requested to location 'http://localhost:8080/web/application.html;jsessionid=7FDB4CC310A8784A3DE7B5D9370D124D' 
17 [org.apache.http.impl.client.DefaultHttpClient] Redirecting to 'http://localhost:8080/web/application.html;jsessionid=7FDB4CC310A8784A3DE7B5D9370D124D' via HttpRoute[{}->http://localhost:8080] 
18 [org.apache.http.client.protocol.RequestAddCookies] CookieSpec selected: compatibility 
19 [org.apache.http.client.protocol.RequestAddCookies] Cookie [version: 0][name: JSESSIONID][value: 7FDB4CC310A8784A3DE7B5D9370D124D][domain: localhost][path: /web][expiry: null] match [localhost:8080/web/application.html;jsessionid=7FDB4CC310A8784A3DE7B5D9370D124D] 
20 [org.apache.http.client.protocol.RequestAuthCache] Auth cache not set in the context 
21 [org.apache.http.impl.client.DefaultHttpClient] Attempt 2 to execute request 
22 [org.apache.http.impl.conn.DefaultClientConnection] Sending request: GET /web/application.html;jsessionid=7FDB4CC310A8784A3DE7B5D9370D124D HTTP/1.1 
23 [org.apache.http.headers] >> GET /web/application.html;jsessionid=7FDB4CC310A8784A3DE7B5D9370D124D HTTP/1.1 
24 [org.apache.http.headers] >> Host: localhost:8080 
25 [org.apache.http.headers] >> Connection: Keep-Alive 
26 [org.apache.http.headers] >> User-Agent: Apache-HttpClient/4.1.2 (java 1.5) 
27 [org.apache.http.headers] >> Cookie: JSESSIONID=7FDB4CC310A8784A3DE7B5D9370D124D 
28 [org.apache.http.impl.conn.DefaultClientConnection] Receiving response: HTTP/1.1 302 Moved Temporarily 
29 [org.apache.http.headers] << HTTP/1.1 302 Moved Temporarily 
30 [org.apache.http.headers] << Server: Apache-Coyote/1.1 
31 [org.apache.http.headers] << Location: http://localhost:8080/web/login.html 
32 [org.apache.http.headers] << Content-Length: 0 
33 [org.apache.http.headers] << Date: Thu, 01 Sep 2011 17:35:49 GMT 
34 [org.apache.http.impl.client.DefaultHttpClient] Connection can be kept alive indefinitely 

As you can see at the line 11 of the log, I am successfully logged on, because the response of the POST has the valid application URL "http://localhost:8080/web/application.html"

But the next GET request returns me to the login page (see the line 28-31).

Why may it happen?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜