java https connexion et la navigation
-
28-09-2019 - |
Question
Je veux connexion à un site https sur Internet avec java, puis lire quelques informations. Je l'ai déjà regardé avec Firebug pour les en-têtes, mais je ne parvenais pas à le faire ...
Firebug dit:
https://service.example.net/xxx/unternehmer/login.html?login=Anmelden&loginname=xxx&password=xxx&sessionid=&sprache=de
Et puis je veux parcourir ce site:
https://service.example.net/xxx/unternehmer/ausgabe.html?code=PORTAL;sessionid=03112010150442
comment puis-je faire avec java? Je l'ai déjà essayé quelque chose comme:
import java.net.*;
import java.io.*;
import java.security.*;
import javax.net.ssl.*;
public class HTTPSClient {
public static void main(String[] args) {
int port = 443; // default https port
String host = "service.example.net";
try {
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
// enable all the suites
String[] supported = socket.getSupportedCipherSuites();
socket.setEnabledCipherSuites(supported);
Writer out = new OutputStreamWriter(socket.getOutputStream());
// https requires the full URL in the GET line
out.write("POST https://" + host + "//xxx/unternehmer/login.html?login=Anmelden&loginname=xxx&password=xxx&sessionid=&sprache=de HTTP/1.1\r\n");
out.write("Host: " + host + "\r\n");
out.write("\r\n");
out.flush();
// read response
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
// read the header
String s;
while (!(s = in.readLine()).equals("")) {
System.out.println(s);
}
System.out.println();
// read the length
String contentLength = in.readLine();
int length = Integer.MAX_VALUE;
try {
length = Integer.parseInt(contentLength.trim(), 16);
}
catch (NumberFormatException ex) {
// This server doesn't send the content-length
// in the first line of the response body
}
System.out.println(contentLength);
int c;
int i = 0;
while ((c = in.read()) != -1 && i++ < length) {
System.out.write(c);
}
System.out.println("1.part done");
out.close();
in.close();
socket.close();
}
catch (IOException ex) {
System.err.println(ex);
}
}
}
Malheureusement cela ne fonctionne pas pour la connexion .... et aussi je ne sais où trouver ce sessionid ... chaque fois qu'il est un autre. J'espère que vous pouvez m'aider. ps: j'ai remplacé des informations pertinentes avec xxx
La solution
Problème résolu:)
D'abord, j'ajouté les bibliothèques de apache:
- httpclient
- commons-httpclient
- commons-codec
- commons-logging
je combiné plusieurs tutoriels.
mon code:
import java.io.BufferedWriter;
import java.io.FileWriter;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.http.client.params.CookiePolicy;
public class Test {
public static final String TARGET_HTTPS_SERVER = "www.example.net";
public static final int TARGET_HTTPS_PORT = 443;
public static void main(String[] args) throws Exception {
HttpClient httpClient = new HttpClient();
httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
PostMethod post = new PostMethod("https://www.example.com/login.html");
post.setRequestHeader(new Header(
"User-Agent", "Mozilla/5.0 /Windows; U; Windows NT 4.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.0"));
post.addParameter("login", "true");
post.addParameter("username", "xxx");
post.addParameter("password", "xxx");
post.addParameter("language", "de");
httpClient.executeMethod(post);
System.out.println(post.getResponseBodyAsString());
String body=post.getResponseBodyAsString();
//Get the session id by parsing the code, i know this is not pretty
String sessionid=body.substring(body.indexOf("session")+10,body.indexOf("session")+10+14);
System.out.print(sessionid);
GetMethod get=new GetMethod("https://www.example.com/thesiteyouwannabrowse?sessionid="+sessionid);
get.setRequestHeader(new Header(
"User-Agent", "Mozilla/5.0 /Windows; U; Windows NT 4.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.0"));
httpClient.executeMethod(get);
System.out.println(get.getResponseBodyAsString());
//write it into a file
try{
// Create file
FileWriter fstream = new FileWriter("file.html");
BufferedWriter out = new BufferedWriter(fstream);
out.write(get.getResponseBodyAsString());
//Close the output stream
out.close();
}catch (Exception e){//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
post.releaseConnection();
}
}
Autres conseils
Je me suis fait des choses semblables. Je l'ai travail en utilisant cette approche « manuel », mais il était assez embêtant, surtout avec la gestion des cookies.
Je vous recommande de jeter un oeil à bibliothèque Apache HttpClient . (J'ai jeté le code que j'avais quand je compris à quel point il était facile d'utiliser cette bibliothèque.)
Comme org.life.java souligne, ici http: // hc. apache.org/httpclient-3.x/sslguide.html est un bon howto sur la façon de démarrer avec SSL à l'aide de cette bibliothèque.