

スマートフォン向けのウェブサービスにおいて、AndroidからのアクセスでGETが連続で来る場合があります。 特徴として、

  * 2回目のリクエストはリファラーがない 
  * 2回目のリクエストは1回目の数秒後ぐらいに来る
  * 2回目のリクエストはユーザーエージェントがDalvik 
  * いくつかの端末で出ている

この問題により、いくつかの機能で不具合のような動作が出ています。  
どのように対策すれば良いでしょうか。

javascriptを読み込ませてこれを送信しないようにする等の方法があれば、ありがたいです。
無ければサーバ側で監視するのでしょうか。サーバ側の環境はphp+Zendです。


CC BY-SA 3.0
2014-12-04T01:22:41.570
334
2016-12-21T07:00:03.220
525
question
android
androidにおけるリクエストの再送信について


Android端末（特定機種）側の不具合と考えられます。  
WebブラウザまたはAndroid OSが独自の判断で再送しているようです。

手元で現象を確認していないので検討できていませんが、JavaScript側で制御は難しいでしょう。  
サーバー側で監視,無視など例外対応が必要です。

Android側の挙動については次の通りです（サーバー側の対応方法は、わかりません）。2回目のリクエストのUserAgentは次のようなものでしたか？

[code]

    "Dalvik/1.6.0 (Linux; U; Android 4.2.2; C2004 Build/15.2.A.2.5)"
    
[/code]

これはAndroidのHttpURLConnectionのUserAgentで、WebブラウザのUAとは異なります。  
Androidアプリでの確認方法は次のとおりです。

[code]

    System.getProperty("http.agent");
    
[/code]

同様の症状がStackOverflowの[Browser sending “Dalvik” as user
agent](https://stackoverflow.com/questions/23804278/browser-sending-dalvik-as-
user-agent)に報告されていました。

初回のリクエストがAndroidのブラウザから行われ、  
何らかの事情でAndroid
OSの[HttpURLConnection](http://developer.android.com/reference/java/net/HttpURLConnection.html)を使ったリクエストが再送されているようです。

UserAgentについてはWebブラウザ（WebView）、HttpURLConnection、HttpClientそれぞれで異なります。通常、ブラウザを利用している場合は、ブラウザのUAが入ります。しかし、Androidは機種ごとにカスタマイズして実装されているため、幾つかの機種固有の問題として、異常系/例外処理？に入ったケースで質問の挙動が起きているのだと推測します


CC BY-SA 3.0
2014-12-04T03:02:08.460
339
2014-12-04T03:02:08.460
2017-05-23T12:38:55.307
-1
395
334
answer


Androidではありませんが、以前 Windows向けのWebアプリをリリースした際に、同様の問題が起こりました。その時の原因はセキュリティソフトでした。

そのセキュリティソフトには、ユーザがアクセスしたサイトが詐欺サイトでないかどうかをチェックする仕組みがありました。ユーザがブラウザでGETリクエストを発行すると、セキュリティソフトがそれを検出して同じURLに対して別途
GETリクエストを発行し、サイトの内容を機械的にチェックするというものです。

HTTP的に「GETリクエストは冪等(idempotent)である」という前提を利用した仕組みですが、実際にはアクセスカウンタなどに影響がでるなど、開発者にとってはあまり嬉しいやり方ではありませんね。

Androidのセキュリティ対策ソフトについてはあまり知見がありませんが、そのようなソフトがインストールされている可能性はないでしょうか？

mhidaka さんが紹介されている本家Stack Overflowのコメントにも McAfee antivirusを
disableにしたら送らなくなったと言っている人がいますね。

なお、私が以前遭遇したセキュリティソフトは、ユーザがアクセスしたサイトのURLを一旦その会社のサーバに送り、サーバからGETリクエストがくるというものでしたのでソースIPアドレスが異なっていましたが、セキュリティソフトによっては、常駐しているプログラム自身がそのようなアクセスを行うものがあるかもしれないです。

今回の問題がセキュリティソフトによるものでなかったとしても、そのようなものが将来出てくる可能性は十分あるので、基本的には「GETリクエストが複数回来ても問題ないようにサーバを作っておく」と良いと思います。


CC BY-SA 3.0
2014-12-04T04:48:19.227
348
2014-12-04T04:48:19.227
832
334
answer


within android 4.2.2 SourceCode

./frameworks/base/core/java/com/android/internal/os/RuntimeInit.java

[code]

    private static String getDefaultUserAgent() {
    
[/code]

this private function will form a useragent and set to "http.agent"

./libcore/luni/src/main/java/libcore/net/http/HttpEngine.java  
HttpEngine will use it.


CC BY-SA 3.0
2016-12-21T06:34:26.403
31287
2016-12-21T07:00:03.220
2016-12-21T07:00:03.220
754
19975
334
answer