2015-12-30 10 views
13

分析のためにRobloxの通貨交換から統計データを収集しようとしています。したがって、私はキャッシュされた結果の代わりに最新のデータが必要です。しかし、私が何をしても結果はまだキャッシュされているようです。最も直観的なオプションsetUseCaches()は効果がなく、手動でヘッダをCache-Control: no-cacheとして設定することはどちらかと思われません。私はFiddler2を使用してCacheヘッダーを検査し、その値がCache-Control: max-age=0であることを確認しましたが、プログラムの動作も変更されていませんでした。ここでは、コードの関連部分は以下のとおりです。Java - HttpUrlConnectionがキャッシュレスポンスを毎回返す

URL:

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(); 

するとまたはそれがユニークな結果に私が再起動するたびに返すことに注意することが重要であってもなくてもよいですプログラムは実行していますが、プログラム実行時は実行しません。

更新:

Wiresharkの分析(私は少し前回の私のコードを微調整):

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

あなたとの間にプロキシがありますインターネット?以前はプロキシキャッシュのために問題がありました。 –

+0

正しいデータでwhiresharkのログを1つ追加し、比較のために間違って2番目のログを追加できますか? –

+0

通信の1つの要求/応答サイクルのWiresharkダンプは十分ではありません。少なくとも2つは必要です。また、wiresharkはクライアントホスト上で動作していますか? –

答えて

4

キャッシュは、サーバー側が発生した場合は、URLへのキャッシュ対策を追加。

+1

それはうまくいかないようです。私はそれがちょうどJavaのバグであると信じ始めているし、私は代替手段を見なければならないだろう。 –

+0

URLにページアンカー(#)があります。接尾辞 "?" URLが機能しない場合は、 ".aspx"の後に追加する必要があります – gn1

+1

リンクは次のようにする必要があります:http://www.roblox.com/my/money.aspx?time=1452336350229#/#TradeCurrency_tab –

1

私はあなたが独自のキャッシュをバイパスするために、ローカルHttpURLConnectionを言っていません注意してください。

HttpURLConnectionは、setUseCaches(boolean)URLConnectionから継承します。 Javadoc for setUseCaches(boolean)

このURLConnectionのuseCachesフィールドの値を、指定された値に設定します。

一部のプロトコルでは、ドキュメントのキャッシュが行われます。場合によっては、キャッシュを「トンネルスルー」して無視することが重要です(ブラウザの「リロード」ボタンなど)。接続上のUseCachesフラグが真の場合、接続は可能なキャッシュを使用することができます。 falseの場合、キャッシュは無視されます。デフォルト値はDefaultUseCachesから得られます。デフォルトはtrueです。

+0

私はその方法を無駄にしようとしました。そして、私が理解するところから、それは "Cache-Control:no-cache"を使うことと同じです。 –

+0

Wiresharkを使用してシステムから要求が送信されているかどうかを確認しましたか?そうでない場合、問題はお客様のクライアントにあります。それは、最初とその後の両方で、交換されているトラフィックを見ることは興味深いでしょう。 –

+0

更新された質問をご覧ください。 –

1

ほとんどのキャッシュ設定を試してみてください。それはあなたのクライアントではないかもしれませんが、これが起こる原因となるサービスです。私は、あなたのwireshark情報から、あなたが "接続キープアライブ"を持っていることを知ることができます。プログラムを再起動するたびにキャッシュされていない結果が得られると言っているので、おそらく、あなたは "Connection Close"にしようとするかもしれません。

これは生産環境では理想的ではないかもしれませんが、何が起きているかについての洞察を与えるかもしれません。

1

問題を正確に特定するためにコンテキストが不足していますが、要求ごとに新しいインスタンスをインスタンス化するのではなく、socketオブジェクトを再利用している可能性があります。

接続が開かれると、useCacheの設定は問題になりません。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()) { 
    // .. 
} 

接続が開かれた場合、それはすぐに戻って、既存のInputStreamインスタンスを再利用します。

1

あなたは以下のヘッダを試してみました:

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

私はあなたのURLConnectionソケットを開く前に、あなたのURLで、次の操作を行うには、あなたをお勧めします:

URLConnection socket = new URL(URL.replaceFirst("#", "?cacheFrom=" + System.currentTimeMillis()+"#")).openConnection(); 
関連する問題