Bei den Klassen aus java.net.*:
System.setProperty( "proxySet", "true" );
System.setProperty( "http.proxyHost", "xxx" );
System.setProperty( "http.proxyPort", "xxx" );
System.setProperty("http.proxyUser", "xxx");
System.setProperty("http.proxyPassword", "xxx");
@see http://www.javaworld.com/javatips/jw-javatip42_p.html
Benoits Marchals Artikel oben brachte die Lösung... und eine gute theoretische Erklärung.
Increasingly, companies require employees to log in to the proxy before accessing the Internet. Login is used to better monitor Internet usage; for example, to monitor what sites are visited.
... und wie oben angemerkt, erwarten die meisten Proxies Username, Password Base64 encoded. Vermutlich funktioniert deshalb die Lösung vom Freitag mit dem username und password property nicht (wird nicht base64 encoded)
Die zweite Lösung funktioniert problemlos.
Bei der ersten Lösung stellt sich zumindest in Domino6 die Notes-Java-Agent-Security in den Weg.
Ich habs nicht ausprobiert, aber hier ist wohl die Lösung, um dieses Problem auszuschalten.
diskussion auf notes.net (http://www-10.lotus.com/ldd/nd6forum.nsf/55c38d716d632d9b8525689b005ba1c0/4fef6974711aece385256d950053c4a2?OpenDocument&Highlight=0,java.policy)
wie gesagt: Agent2 läuft hier problemlos. Wäre nett, wenn das andere hinter Firmenfirewalls auch mal ausprobieren könnten:
DEIN_NAME, DEIN_PASSWORT, DEIN_PROXY mit eigenen Werten ersetzen.
lsg 1: scheitert an Policy, die verändert werden kann.
import lotus.domino.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
// (my code walks here)
String url = "http://www.marchal.com/",
proxy = "DEIN_PROXY",
port = "8080",
username = "DEIN_NAME",
password = "DEIN_PASSWORT";
Authenticator.setDefault(new SimpleAuthenticator(
username,password));
URL server = new URL(url);
Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",proxy);
systemProperties.setProperty("http.proxyPort",port);
HttpURLConnection connection = (
HttpURLConnection)server.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
BufferedReader inReader = new BufferedReader(new InputStreamReader(in));
String inputLine;
while ((inputLine = inReader.readLine()) != null)
System.out.println(inputLine);
// (my code stops here)
} catch(Exception e) {
e.printStackTrace();
}
}
}
class SimpleAuthenticator
extends Authenticator
{
private String username,
password;
public SimpleAuthenticator(String username,String password)
{
this.username = username;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(
username,password.toCharArray());
}
}
lsg2 funktioniert:
import lotus.domino.*;
import java.io.*;
import java.net.*;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
int port = 8080;
String url = "http://www.marchal.com/",
proxy = "DEIN_PROXY",
authentication = "DEIN_NAME!!!:DEIN_PASSWORT";
URL server = new URL(url);
Socket socket = new Socket(proxy,port);
Writer writer = new OutputStreamWriter(socket.getOutputStream(),
"US-ASCII");
writer.write("GET " + server.toExternalForm() + " HTTP/1.0\r\n");
writer.write("Host: " + server.getHost() + "\r\n");
writer.write("Proxy-Authorization: Basic "
+ new sun.misc.BASE64Encoder().encode(
authentication.getBytes())
+ "\r\n\r\n");
writer.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(
socket.getInputStream(),"US-ASCII"));
String line = reader.readLine();
if(line != null && line.startsWith("HTTP/"))
{
int sp = line.indexOf(' ');
String status = line.substring(sp + 1,sp + 4);
if(status.equals("200"))
{
while ((line = reader.readLine()) != null) {
System.out.println(line); }
}
else
throw new FileNotFoundException("Host reports error " +
status);
}
else
throw new IOException("Bad protocol");
reader.close();
writer.close();
socket.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
Komisch beide Urls funktionieren ohne firewall mit diesem Java-Standalone Programm.
/* UrlTest.java
* Created on 26.10.2003
*/
import java.net.*;
import java.io.*;
/**
* Add one sentence class summary here.
* Add class description here.
*
* @author Axel
* @version 1.0, 26.10.2003
*/
public class UrlTest {
/**
*
*/
public UrlTest() {
super();
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
try {
URL yahoo = new URL("http://www.adobe.de/products/acrobat/readstep.html");
BufferedReader in =
new BufferedReader(new InputStreamReader(yahoo.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Werds Montag hinter der Firmenfirewall mit dem Agent ausprobieren.
Ein Grund kann sein, dass der Server Zugriff aus Java nicht zulässt (Etwa um den Zugriff von Robots und Webspidern auszuschliessen).
Im http-Request header steht nämlich Java-Agent. Einen Grund für solche Einstellungen bei den genannten Hosts kann ich mir nicht vorstellen.