# Internetseite abrufen (Caching Problem)



## Vayu (19. Mai 2008)

Erstmal hallo an Java-forum.org 

ich war bisher immer nur lesenderweise als Gast hier bei Euch unterwegs, aber jetzt brauche ich auch mal professionelle Hilfe 

Ich mache folgendes:

Ich entwickle in Eclipse ein kleines plugin, welches Eine website abfragt und die Daten in einem View anzeigt. Das ist alles soweit kein problem.

Die Daten, die abgefragt werden liegen auf einem "fisheye"-server. das ist ein server, der unsere CVS checkins mitloggt. Sodass man zum Beispiel anhand von dem checkin kommentar nach den unter dem Kommentar eingecheckten files suchen kann.

Auf diesen Server muss man sich einloggen, um an die Daten zu kommen, das mache ich so:


```
// Create an instance of HttpClient.
        HttpClient client = new HttpClient();

        // Create a method instance.
        GetMethod method = new GetMethod(
            "http://fisheye.example.com:8080/login?username=USER&password=PASSWORD&origUrl=search/cvsroot/?col=path%26csv=true%26comment="
                + someComment );

        // Provide custom retry handler is necessary
        method.getParams()
              .setParameter( HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler( 3, false ) );

        try {
            method.setRequestHeader( "Pragma", "no-cache" );
            method.setRequestHeader( "Cache-Control", "no-store, no-cache, must-revalidate" );
            method.setRequestHeader( "cache-directive", "no-store, no-cache, must-revalidate" );
            method.setRequestHeader( "Expires", "1" );
            method.setRequestHeader( "Cache-store", "no-store" );
            // Execute the method.
            int statusCode = client.executeMethod( method );

            if( statusCode != HttpStatus.SC_OK ) {
                System.err.println( "Method failed: " + method.getStatusLine() );
            }
            // Read the response body.
            String responseBody = method.getResponseBodyAsString();

            return responseBody;

        } catch( HttpException e ) {
            System.err.println( "Fatal protocol violation: " + e.getMessage() );
            e.printStackTrace();
        } catch( IOException e ) {
            System.err.println( "Fatal transport error: " + e.getMessage() );
            e.printStackTrace();
        } finally {
            // Release the connection.
            method.releaseConnection();
            client.getHttpConnectionManager().closeIdleConnections( 1 );
        }
        return "";
```

Damit komme ich auch an die Daten heran. ALLERDINGS und jetzt kommts, ihr seht evtl auch im Code schon mein Problem


```
method.setRequestHeader( "Pragma", "no-cache" );
            method.setRequestHeader( "Cache-Control", "no-store, no-cache, must-revalidate" );
            method.setRequestHeader( "cache-directive", "no-store, no-cache, must-revalidate" );
            method.setRequestHeader( "Expires", "1" );
            method.setRequestHeader( "Cache-store", "no-store" );
```

ich hab schon recht viel probiert, aber sobald ich einmal die Daten abfrage, ein neues File mit dem kommentar einchecke, kriege ich das bei der nächsten Abfrage nicht mit ausgegeben. wenn ich die url in meinen browser eingebe, bekomme ich aber das korrekte ergebnis angezeigt.

Das lässt für mich nur die vermutung zu, dass Java/Eclipse/Irgendwer diese suchanfrage cached und ich deshalb das alte ergebnis zurückbekomme.

was kann ich noch tun, damit das nicht gecached wird?

Bin verzweifelt 

gruß und dank

Vayu


----------



## cburghardt (19. Mai 2008)

Vayu hat gesagt.:
			
		

> method.setRequestHeader( "Pragma", "no-cache" );
> method.setRequestHeader( "Cache-Control", "no-store, no-cache, must-revalidate" );
> method.setRequestHeader( "cache-directive", "no-store, no-cache, must-revalidate" );
> method.setRequestHeader( "Expires", "1" );
> method.setRequestHeader( "Cache-store", "no-store" );


Expires ist ein Header den der Server setzt und da steht das Datum drin (oder 0). Also weg damit.
Beschränke dich am Besten auf Cache-Control: no-cache
Welche Header hat denn der Server beim response gesetzt (insbesondere last-modified und expires)?


----------



## Vayu (19. Mai 2008)

ich hab zum schluss einfach nur alles mal ausprobiert 

im Response body kam Cache-Control: private zurück, sowie ein last-modified was immer ne stunde zurücklag. wenn ich lang genug gewartet hab, dann hab ich auch das neue ergebnis zurückbekommen. Aber dazu musste ich immer so ne knappe stunde warten

und der ändert das auch nicht, egal was ich ich ihm als request hinschicke.


----------



## cburghardt (19. Mai 2008)

Dann würde ich empfehlen mit einem http Trace in deinem Browser (gibts für IE und Firefox) zu überprüfen wo der Unterschied in den Headern liegt, dass ist schnell erledigt. 
Nach meinen Infos cached der httpclient nicht (wo sollte er auch...) also kann es nur an einem Proxy dazwischen liegen oder der Server braucht doch einen magischen (nicht konformen) Schalter.


----------



## Vayu (19. Mai 2008)

hm, ok gute idee da schau ich nochmal. melde mich evtl mal wieder dann 

habe mal für FF Live HTTP Headers benutzt.

Da sehe ich unter Cookie einen zusätzlichen eintrag namens:

cruciblesprefs1="D%3D1211189319525"

dazu finde ich auch unter google nix.

und ein If-Modified-Since: Mon, 19 May 2008 09:28:39 GMT

hmm sollte ich mir echt sonen Datumsstring zurechtbasteln müssen?

ich probiers mal damit. muss nur warten bis mal wieder jemand was eincheckt


----------



## maki (19. Mai 2008)

In Eclipse:
Preferences -> Internet -Cache -> Disable Cache

Hilft das?

Ansonsten könntest du deiner URL jedesmal einen Timestamp mitgeben, so sollte eigentlich nicht mehr gecacht werden können, ist aber nur 'ne  Notlösung:

http://meine.url?timestamp=BeiJedemReuqestNeuGenerieren


----------



## Vayu (19. Mai 2008)

oh das ist noch ne gute idee. das werd ich auch noch testen


----------



## Vayu (19. Mai 2008)

ok das hat irgendwie alles nicht funktioniert 

hab jetzt mal den kompletten requestheader, den ich aus Live HTTP Headers mitgeschnitten habe nachgebaut. bringt trotzdem nichts.

timestamp nutzt auch nichts und Internet-Cache auch nicht 

bin echt am Ende mit meinem Latein.


----------



## Vayu (19. Mai 2008)

ok got it. ich hab in ner anderen suchmaske eine option entdeckt, die da heisst refresh=y

wenn ich die im Javaprogramm mit eingebe funzt es. komischerweise hat die mein browser nicht gebraucht 

aber nun bin ich glücklich und zufrieden, danke für Eure bemühungen und tipps.

Gruß,

Vayu


----------

