문제

다음 코드에서는 Applet 내에서 URL에 연결하면 JDK의 URLConnection 클래스가 사용되는 경우 브라우저 세션이 보존되어 있는지 확인했습니다. 그러나 Apache의 httpclient 라이브러리가 사용되는 경우에는 그렇지 않습니다. 왜 그런지 아는 사람이 있습니까? 또는 httpclient 인스턴스에서 사용할 연결 인스턴스를 설정하는 방법이 있습니까?

import java.applet.Applet;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URISyntaxException;
import java.net.URL;

import javax.net.ssl.SSLException;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;

public class HttpClientTesterApplet extends Applet {
    private static final long serialVersionUID = -1599714556710568947L;

    public void testHttpClient() throws ClientProtocolException, IOException,
            URISyntaxException {
        URL url = new URL(String.format("%s://localhost:%s/%s/testHttpClient",
                getParameter("protocol"), getParameter("port"),
                getParameter("context")));

        HttpClient client = new DefaultHttpClient();

        HttpPost post = new HttpPost(url.toURI());

        System.out.println("Executing request " + post.getURI());

        try {
            System.out
                    .println(client.execute(post, new BasicResponseHandler()));
        } catch (SSLException e) {
            System.out.println(e.getMessage());
        }

        System.out.println("Executed request " + post.getURI());

        System.out.println("Opening connection " + url);

        HttpURLConnection urlConnection = (HttpURLConnection) url
                .openConnection();

        System.out.println("Opened connection " + url);

        urlConnection.setRequestMethod("POST");

        System.out.println("Connecting");

        urlConnection.connect();

        System.out.println("Connected");

        InputStream inputStream = urlConnection.getInputStream();

        try {
            while (inputStream.read() != -1) {
                System.out.println("Reading");
            }
        } finally {
            inputStream.close();
        }
    }
}
도움이 되었습니까?

해결책

이는 소켓을 통해 자체 URL 연결을 구현하는 라이브러리의 일반적인 문제입니다. 분명히 URLConnection 클래스의 JRE 구현은 브라우저 정보를 직접 얻을 수 있습니다. 우리는 위의 Oscargm에서 언급 한대로 기술을 사용해야했습니다. 즉, appserver는 요청 쿠키를 애플릿의 매개 변수로 작성하고 JavaScript를 사용하여 브라우저의 문서 쿠키에 들어가는 것입니다 (이것은 쿠키 세트가 May의 SSO의 경우입니다. 중간 에이전트 (프록시 서버)로 인해 동일하지 않음). 쿠키가 httponly 인 경우 JavaScript 코드가 실패합니다.

다른 팁

당신은 보내야합니다 jsessionid 쿠키 또는 URL을 다시 작성하여 사용하십시오 jsessionid.

그것이 서버가 세션을 아는 방식입니다.

당신이 생성한다면 applet JSP 페이지에서 동적으로 태그를 전달할 수 있습니다. jsessionid애플릿에 매개 변수로 값을 사용한 다음 사용하십시오.

post.setHeader("Cookie", "jsessionid=" + jsessionidValue );

이전 버전의 httpclient를 사용하고 있다고 생각합니다. 체크 아웃 httpclient의 웹 사이트.

현재 API에서는 Execute 메소드에서 httpstate를 사용할 수 있으므로 코드가 다음과 같이 보일 수 있습니다.

HttpClient client = new HttpClient();
HttpMethod method = new PostMethod(url.toURI());
HttpState state = new HttpState();

client.executeMethod(HttpConfiguration.ANY_HOST_CONFIGURATION, method, state);

다음 실행에서 동일한 "상태"객체를 전달하면 자격 증명과 쿠키가 보존됩니다.

가능한 원인은 URLConnection을 사용할 때 연결 끊기 ()를 수행하지 않았지만 APACHE 라이브러리가 완료되면 연결을 닫습니다.

Thi는 중요한 문제입니다.

표준 java.net.urlConnection 클래스는 Java 플러그인 및 웹 브라우저와 완벽하게 통합되며 세션, HTTP 인증 토큰, 프록시 커넥터 등을 상속받을 수 있습니다.

Apache Commons의 직원들은 표준 java.net.url* 클래스 위에서 발전하는 대신 소켓 (즉, 처음부터 처음부터 httpclient)을 구현하기로 결정했을 때 심한 실수를했습니다. httpclient는 java.net.urlconnection에서 상속되지 않으므로 고급 엔터프라이즈 기능을 상속받을 수 없습니다.

OpenSource 프로젝트는 생각만큼 똑똑하지 않을 수도 있습니다.

이 코드와 함께 웹 페이지의 인수로 쿠키를 전달하지 않고 작동하게 할 수 있습니다.

private String retrieveCookies(URL url) throws IOException, URISyntaxException 
{ 
     String cookieValue = null;

     CookieHandler handler = CookieHandler.getDefault();
     if (handler != null)    {
          Map<String, List<String>> headers = handler.get(url.toURI(), new HashMap<String, List<String>>());

          List<String> cookiesList = headers.get("Cookie");
          if (cookiesList != null)
          {
              for (String v : cookiesList) {
                  if (cookieValue == null) 
                      cookieValue = v; 
                  else
                      cookieValue = cookieValue + ";" + v; 
              }
          }
     } 
     return cookieValue; 
}

...

httppost.addHeader("Cookie", retrieveCookies(new URL(uploadUrl)));

JDK의 클래스 쿠키 핸들러는 다행히 "시스템"매장에서 쿠키를 얻을 수 있습니다. 이 경우 Java 플러그인을 통해 Accesed Browser Store입니다.

일종의 "수동 작업"이지만 작동합니다.

참고 : 코드를 찾았습니다 여기

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top