2015-12-30 21 views
13

Sto cercando di raccogliere dati statistici dal cambio valuta di Roblox per l'analisi. Pertanto, ho bisogno di dati aggiornati invece di un risultato memorizzato nella cache. Tuttavia, sembra che non importa quello che faccio, il risultato è ancora memorizzato nella cache. Sembra che l'opzione più intuitiva, setUseCaches(), non abbia avuto effetto e l'impostazione dell'intestazione manualmente come Cache-Control: no-cache non sembra funzionare neanche. Ho ispezionato l'intestazione di Cache usando Fiddler2 e ho visto che il suo valore era Cache-Control: max-age=0, ma non sembrava modificare il comportamento del programma. Qui ci sono le rilevanti porzioni di codice:Java - HttpUrlConnection restituisce ogni volta la risposta memorizzata nella cache

URL:

richiesta GET:

URLConnection socket = new URL(URL).openConnection(); 
    socket.setUseCaches(false); 
    socket.setDefaultUseCaches(false); 
    HttpURLConnection conn = (HttpURLConnection)socket; 
    conn.setUseCaches(false); 
    conn.setDefaultUseCaches(false); 
    conn.setRequestProperty("Pragma", "no-cache"); 
    conn.setRequestProperty("Expires", "0"); 
    conn.setRequestProperty("Cookie", ".ROBLOSECURITY=" + ROBLOSECURITY); 
    conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); 
    conn.setRequestProperty("Accept-Language", "en-US,en;q=0.8"); 
    conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36"); 
    conn.setDoInput(true); 
    conn.setRequestMethod("GET"); 
    conn.connect(); 

    Scanner data = new Scanner(conn.getInputStream()); 
    data.useDelimiter("\\A"); 
    String result = data.next(); 

    data.close(); 
    conn.disconnect(); 

Si può o non può essere importante notare che restituisce un risultato unico ogni volta che ricomincio il programma ma non durante il runtime del programma.

Aggiornamento:

analisi Wireshark (ho ottimizzato il mio codice un po 'dall'ultima volta):

GET /my/money.aspx HTTP/1.1 
Pragma: no-cache 
Expires: 0 
Cookie: .ROBLOSECURITY=_|WARNING:-DO-NOT-SHARE-THIS.--Sharing-this-will-allow-someone-to-log-in-as-you-and-to-steal-your-ROBUX-and-items.|*sensitive* 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Accept-Language: en-US,en;q=0.8 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36 
Cache-Control: no-cache 
Host: www.roblox.com 
Connection: keep-alive 

HTTP/1.1 200 OK 
Cache-Control: private, s-maxage=0 
Content-Type: text/html; charset=utf-8 
Set-Cookie: rbx-ip=; domain=roblox.com; path=/; HttpOnly 
Set-Cookie: RBXSource=rbx_acquisition_time=1/4/2016 12:45:21 AM&rbx_acquisition_referrer=&rbx_medium=Direct&rbx_source=&rbx_campaign=&rbx_adgroup=&rbx_keyword=&rbx_matchtype=&rbx_send_info=0; domain=roblox.com; expires=Wed, 03-Feb-2016 06:45:21 GMT; path=/ 
Access-Control-Allow-Credentials: true 
Set-Cookie: rbx-ip=; domain=roblox.com; path=/; HttpOnly 
Set-Cookie: RBXSource=rbx_acquisition_time=1/4/2016 12:45:21 AM&rbx_acquisition_referrer=&rbx_medium=Direct&rbx_source=&rbx_campaign=&rbx_adgroup=&rbx_keyword=&rbx_matchtype=&rbx_send_info=1; domain=roblox.com; expires=Wed, 03-Feb-2016 06:45:21 GMT; path=/ 
Set-Cookie: RBXEventTrackerV2=CreateDate=1/4/2016 12:45:21 AM&rbxid=59210735&browserid=3940274345; domain=roblox.com; expires=Fri, 22-May-2043 05:45:21 GMT; path=/ 
Set-Cookie: GuestData=UserID=-856460986; domain=.roblox.com; expires=Fri, 22-May-2043 05:45:21 GMT; path=/ 
P3P: CP="CAO DSP COR CURa ADMa DEVa OUR IND PHY ONL UNI COM NAV INT DEM PRE" 
Date: Mon, 04 Jan 2016 06:45:20 GMT 
Content-Length: 153751 
+1

C'è un proxy tra voi e la Internet? Ho avuto problemi a causa della cache del proxy prima. –

+0

È possibile aggiungere un registro per whirehark con dati corretti e il secondo con errato per il confronto? –

+0

Il dump di Wireshark di un ciclo di richiesta/risposta della comunicazione non è sufficiente. Abbiamo bisogno di almeno due di quelli. Inoltre, wireshark è in esecuzione sull'host del client? –

risposta

4

Se la memorizzazione nella cache si verifica sul lato server, aggiungere un cachebuster all'URL.

+1

Sembra non funzionare. Sto iniziando a credere che sia solo un bug java e dovrò cercare mezzi alternativi. –

+0

L'URL ha un'ancora di pagina (#). Suffisso "?" dopo l'URL non funzionerà. Deve essere aggiunto dopo ".aspx" – gn1

+1

Link dovrebbe essere come: http://www.roblox.com/my/money.aspx?time=1452336350229#/#TradeCurrency_tab –

1

Ho notato che non stai dicendo la locale HttpURLConnection per bypassare propri cache.

HttpURLConnection eredita il metodo setUseCaches(boolean) da URLConnection. Da Javadoc for setUseCaches(boolean)

Imposta il valore del campo useCaches di questa URLConnection sul valore specificato.

Alcuni protocolli fanno il caching di documenti. Occasionalmente, è importante essere in grado di "tunnel through" e ignorare le cache (ad esempio, il pulsante "ricarica" ​​in un browser). Se il flag UseCaches su una connessione è true, la connessione può utilizzare qualsiasi cache possibile. Se false, le cache devono essere ignorate. Il valore predefinito deriva da DefaultUseCaches, che per impostazione predefinita è true.

+0

Ho provato a utilizzare tale metodo senza alcun risultato . E da quello che capisco, è come usare "Cache-Control: no-cache". –

+0

Hai usato Wireshark per determinare se il tuo sistema sta inviando la richiesta? In caso contrario, il problema è nel tuo cliente. Sarebbe interessante vedere il traffico che viene scambiato, sia la prima volta che successivamente. –

+0

Vedere la mia domanda aggiornata. –

1

Visto che hai provato la maggior parte delle impostazioni della cache. Potrebbe essere che non è il tuo cliente, ma il loro servizio che lo fa accadere. Posso vedere dalle tue informazioni su wirehark che hai "Connection Keep-Alive". Forse potresti provare a impostarlo su "Connessione chiusa" poiché dici che ogni volta che riavvii il programma ottieni un risultato non memorizzato nella cache.

Questo potrebbe non essere l'ideale in un ambiente di produzione, ma forse potrebbe darvi un'idea di ciò che sta accadendo.

1

Manca contesto (il modo in cui il dato pezzo di codice è stato richiamato più volte) per individuare il problema con precisione, ma potrebbe essere dovuto al riutilizzo dell'oggetto socket invece di istanziarne uno nuovo per ogni richiesta.

Una volta aperta la connessione, l'impostazione useCache non ha importanza.Date un'occhiata alla realizzazione di sun.net.www.protocol.http.HttpURLConnection#connect:

protected void plainConnect() throws IOException { 
    if (connected) { 
     return;   
    } 
    // try to see if request can be served from local cache 
    if (cacheHandler != null && getUseCaches()) { 
    // .. 
} 

Se la connessione è stata aperta, tornerà immediatamente e riutilizzare il InputStream istanza esistente.

1

Hai provato le seguenti intestazioni:

Cache-Control: no-cache 
Pragma: no-cache 
If-Modified-Since: Sat, 1 Jan 2000 00:00:00 GMT 
0

io vi suggerisco di eseguire la seguente operazione sul vostro URL prima di aprire la presa URLConnection:

URLConnection socket = new URL(URL.replaceFirst("#", "?cacheFrom=" + System.currentTimeMillis()+"#")).openConnection();