# Session Cookies Java



## MPW (15. Jan 2006)

Moin,

ich moechte auf einer Website, die mit sessions per Cookies arbeitet, mit einem Javaprogramm draufzugreifen.

Die Webpages kann ich oefnnen, aber ich kriege immer Fehlermeldungen, weil die Cookies nicht funzen. Auf der Website selber steht auch, dass man die Cookies aktivieren muss.

Also wie kann ich
 - Coockies speichern(auf der Startseite wird ein cookie angelegt)
 - und dann uebermitteln, auf einer subsite

Hat das schonmal jemannd gemacht und hat vllt. einen Codeschnipsel fuer mich?

MfG
MPW


----------



## Murray (15. Jan 2006)

Im Prinzip ist es ganz einfach: der Server schickt im HTTP-Response einen "Set-Cookie"-Header, z.B.
Set-Cookie: my_cookie_name=my_cookie_value
Set-Cookie: my_simple_cookie

Diese Header wertest Du aus, indem das den Teil hinter dem Doppelpunkt am Gleichheitszeichen auftrennst und das entstehen "key-value-pair" z.B. in einer HashMap speicherst (Achtung: im Set-Cookie kann auch nur ein Name kommen, also ohne Gleichheitszeichen und Wert; damit muss man auch klarkommen)

In Zukunft schickst Dein Client bei jedem weiteren Request an diese URL alle empfangenen Cookies jeweils in einem "Cookie"-Header mit.

Bsp:

GET /index.html HTTP/1.0
Cookie: my_cookie_name=my_cookie_value
Cookie: my_simple_cookie

Bei den Set-Cookie-Headern gibt es noch ein paar Feinheiten  (expires, path, domain), aber für den Anfang reichet das vielleicht schon.


----------



## MPW (15. Jan 2006)

hm, danke schonmal, die Therie ist somit soweit klar, aber wie baue ich das jetzt hier ein:


```
public String systemComString(String s1) throws IOException {
        String s2 = s1;
        URL url = new URL(s2);
        URLConnection urlconnection = url.openConnection();
        InputStreamReader inputstreamreader = new InputStreamReader(urlconnection.getInputStream());
        int i1 = inputstreamreader.read();
        String sComResult = "";
        for(; i1 != -1; i1 = inputstreamreader.read())
            sComResult += (char)i1;

        inputstreamreader.close();
        return sComResult;
    }
```


----------



## MPW (15. Jan 2006)

Okay, hab das jetzt mal so weit alles implementiert, kiege aber immer eine 400 BadURLException:


```
import java.net.*;
import java.io.*;
import java.util.*;

class VoteForNottuln {
	Vector<String> cookies = new Vector<String>(0, 1);

	public VoteForNottuln() {
		String back = "";
		System.out.print("Lade main-page um SID-Schluessel zu bekommen: ");
		try {
			back = systemComString("http://www.wm-tour2006.de/voting.php");
		} catch (IOException e) {
			System.out.println("Fehler beim Holen des Schluessels!");

		}

		try {
			String votingString = "http://www.wm-tour2006.de/voting2.php?";
			String toparse = cookies.get(0);
			toparse = toparse.substring(toparse.indexOf("SID"),toparse.indexOf("SID")+35);
			votingString += toparse;
			back = systemComString(votingString);
		} catch (IOException e) {
			System.out.println("Fehler beim Holen des Schluessels!");
			e.printStackTrace();
		}


		try {
			BufferedWriter out = new BufferedWriter(new FileWriter("return.html"));
			out.write(back);
			out.close();
		} catch (IOException e) {
			System.out.println("Schreibfehler");
		}
	}
	public static void main(String args[]) {
		new VoteForNottuln();
	}
    public String systemComString(String s1) throws IOException {
        String s2 = s1;
        if (cookies.size() > 0) {
			for (int i = 0; i < cookies.size(); i++) {
				s2 += " " + cookies.get(i);
			}
		}

        URL url = new URL(s2);
        URLConnection urlconnection = url.openConnection();

		Map<String,List<String>> headerFields = urlconnection.getHeaderFields();
		Set<String> set = headerFields.keySet();
		Iterator<String> itor = set.iterator();
		while (itor.hasNext()) {
			String key = itor.next();
			try {
				if (key.equals("Set-Cookie")) {
					cookies.add("Cookie: " + headerFields.get(key));
				} else {
				}
			} catch (NullPointerException e) {
			}
		}

		for (int i = 0; i < cookies.size(); i++) {
			System.out.println(cookies.get(i));
		}

		InputStreamReader inputstreamreader = new InputStreamReader(urlconnection.getInputStream());
        int i1 = inputstreamreader.read();
        String sComResult = "";
        for(; i1 != -1; i1 = inputstreamreader.read())
            sComResult += (char)i1;

        inputstreamreader.close();
        return sComResult;
    }
}
```


----------



## Murray (16. Jan 2006)

Du baust die Cookies ja in die URL ein, das geht so nicht. Die Cookies gehören in den HTTP-Header.


----------



## Bleiglanz (16. Jan 2006)

schau mal in die API

seit Java5 gibts Cookie Support

java.net.CookieHandler


----------



## Murray (16. Jan 2006)

Ohne den eingebauten Cookie-Handler müsstest Du den Code etwa so abändern:

```
HashMap<String,String> cookies = new HashMap<String,String>();

/* ... */

if (key.equals("Set-Cookie")) {
	String cookieHdr = headerFields.get( key);
	//--- cookieHdr: name[=value][ expires=<expriryDate>][ path=<path>][ domain=<domain>][ secure]
				
	//--- we're interested in the first argument only (either an simple name or a key-value-pair)
	String arg1 = cookieHdr.split( " ")[0]; //--- split at blank
	int idx = arg1.indexOf( "=");
	if ( idx <= 0) {
		cookies.put( arg1, null);
	} else {
		String nam = arg1.substring( 0, idx).trim();
		String val = arg1.substring( idx-1, arg1.length()).trim();
		cookies.put( nam, val);
	}
				
	cookies.add("Cookie: " + headerFields.get(key));
} else {
}

/* ... */

URLConnection conn = url.openConnection();

StringBuilder sb = new StringBuilder();
for ( String key : cookies.keySet()) {
	sb.append( key);
	String val = cookies.get( key);
	if ( val == null) {
		sb.append( "=");
		sb.append( val);
	}
	sb.append( "; ");
}
conn.setRequestProperty("Cookie", sb.toString());
conn.connect();
```


----------



## MPW (16. Jan 2006)

Hallo,

schoenen danke fuer die Hilfe schonmal, hab aber noch ein kleines Problem, mit dem Code aus dem letzten Post:


```
C:\Temp\VoteForNottuln.java:68: incompatible types
found   : java.util.List<java.lang.String>
required: java.lang.String
				   String cookieHdr = headerFields.get(key);
                                                                      ^
1 error

Prozess beendet mit Exit-Code 1
```

Wie kann ich das loesen? eigentlich muesste das doch klappen, weil das doch ist doch ein String?, das ist doch darueber als String deklariert:


```
String key = itor.next();
```


----------



## Murray (17. Jan 2006)

Sorry, da habe ich mich versehen. Das Problem ist nicht "key", sondern

```
Map<String,List<String>> headerFields = urlconnection.getHeaderFields();
```
headerFields.get( key) liefert also keinen String, sondern eine Liste von Strings (also in etwa das, was ich mit dem split( " ") bewirken wollte.


----------

