WebView.goBack()がページを再読み込みしない

4,176 views
Skip to first unread message

asaiarito

unread,
Aug 16, 2011, 10:49:20 AM8/16/11
to android-...@googlegroups.com
浅井です。お世話になっております。

WebViewに限らず、Androidのブラウザでも同じ振る舞いなのですが、

WebViewを用いて、PageAをひらきます。そこからフォームをサブミット
して(POSTで)PageBをひらきます。

BACKボタンをハンドルして、WebView.goBack()を読んでやります。

PageAはキャッシュをしないようにメタタグおよびヘッダをつけて
あるので、WebViewはWebサーバに再度PageAを要求に来ます。

WebサーバはPageAを返すのですが、HTMLの中でほんの一部分だけ
内容が変化したPageA’を返します。ステータスコードは200 OKです。
Content-Lengthは変わりません。当然キャッシュは禁止です。
日付は更新され、ETagはつけていません。

当然、WebサーバはPageA'を返したのでブラウザの画面にはPageA'が
表示されているべきなのですが、なぜか前回表示したPageAが表示
されています。

サーバにはちゃんとリクエストがきて、レスポンスを返したのにも
かかわらずです。その間、WebViewではWebViewClientのonPageStarted()
が呼ばれ、onPageFinished()が呼ばれているので、確かにサーバから
PageA'のHTMLを受信しているように思います。

WebView.reload()の場合は、ちゃんと新しいコンテンツに表示が
更新されます。

同じサーバで、PCのブラウザ、iPhoneのUIWebViewでアクセスする
場合には、「戻る」でリクエストが着て、返したレスポンスが正しく
表示されるのですが。

Androidのブラウザは、ページの内容がほとんど同じだと、全部同じ
とみなして再解釈しないとかあるんでしょうか?

ニッチな質問ですみません。どなたか情報をお持ちでしたらよろしく
お願いします。

Arito Asai

unread,
Aug 16, 2011, 9:10:36 PM8/16/11
to android-...@googlegroups.com
浅井です。

すみません、その後の調査の結果、下記の記述は不正確で、
WebViewは正しくPageA'を読み込んでいるのですが、PageA'
の中のフォームデータ(INPUTタグのValue要素)の値がサーバ
側から降らせた新しい値ではなく、前回POSTした古い値が自動
的にセットされるという問題でした。

> HTMLの中でほんの一部分だけ内容が変化した

と書いた、一部分とはフォームデータのデフォルト値のことです。

それはそれで未解決です。

2011年8月16日23:49 asaiarito <asai...@gmail.com>:

Arito Asai

unread,
Aug 16, 2011, 11:37:37 PM8/16/11
to android-...@googlegroups.com
浅井です。

続報です。

簡単な再現系をつくってみました。

https://ari3.net/test.php

にAndroidのブラウザからアクセスします。
(証明書はニセモノなので警告がでます)

乱数で表示した数字と、同じ値がフォームに入っています。

フォームを送信して(あるいはリンクで遷移して)、戻るで
戻ってくると、再リクエストされて乱数は更新されている
のですが、フォームの値が前回のままで、HTML中で指定
した値になっていません。

(HTTPでアクセスすると、そもそも再リクエストが出ない
ようです。)

つまり、HTMLは新しく読み込んでいるのに、フォームのValueが
更新されないという問題です。

iPhone、PC等のほかのブラウザでは発生しません。

やりたいことは、アプリの中のWebViewから使いたいので
WebView.goBack()の前後にWebView.clearFormData()も
試してみたのですがNG(動作変わらず)でした。

目的はフォームのhiddenタグの中にワンタイムのトークンを
入れたいのです。

現状わかっている回避策は、Javascriptを用いてOnLoad()にて
フォームのValueを改めて書き直すことですが、全ページに変な
仕掛けを導入するのは気乗りがしません。

サーバのPHP側のソースは以下の通りです。困った。

<?php
header("Content-Type: text/html; charset=utf-8");
header("Cache-Control: no-cache,no-store");
?><html>
<head>
<title> test </title>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<meta http-equiv='Pragma' content='no-cache'>
<meta http-equiv='CACHE-CONTROL' content='NO-CACHE'>
<meta http-equiv='Expires' content='0'>
</head><body>
Test
<?php

$r = rand();
echo $r;

?>
<form action="dummy.html" method="POST">
<input type="text" name="foo" value="<?php echo $r ?>" />
<input type="submit" name="OK" />
</form>
<a href="dummy.html" >link</a>
</body>
</html>

2011年8月17日10:10 Arito Asai <asai...@gmail.com>:

Keiji Ariyama

unread,
Aug 17, 2011, 6:54:21 AM8/17/11
to android-...@googlegroups.com
有山です。

 こちらでも現象を確認しました。

 例えばなのですが、今回、このフォームが、住所や氏名を入力するフォームで
あったとします。
 フォームに住所や氏名を入力して送信後、何かの事情でgoBackで戻った場合、
戻った先は、入力済みの内容であって欲しいと僕は思います(全部真っ白になっ
ていたら、逆に困ります)。
 なので、これはこれで正しい動作なのではないかと考えているのですが、この
あたり、他の人の意見もお聞かせ願えればと思います。

 ちなみに、loadUrlで前のURLを指定すると再読み込みが正常に行われます。
 なので、自前で履歴機能を実装して、バックボタンが押されると、一つ前の
URLをloadUrlで読み込むというのはいかがでしょうか。

> <meta http-equiv='Content-Type' content='text/html; http-equiv='Pragma'

> content='no-cache'>
> <meta http-equiv='CACHE-CONTROL' content='NO-CACHE'>
> <meta http-equiv='Expires' content='0'>
> </head><body>
> Test
> <?php
>
> $r = rand();
> echo $r;
>
> ?>
> <form action="dummy.html" method="POST">
> <input type="text" name="foo" value="<?php echo $r ?>" />
> <input type="submit" name="OK" />
> </form>
> <a href="dummy.html" >link</a>
> </body>
> </html>
>
> 2011年8月17日10:10 Arito Asai <asai...@gmail.com

> <mailto:asai...@gmail.com>>:


>
> 浅井です。
>
> すみません、その後の調査の結果、下記の記述は不正確で、
> WebViewは正しくPageA'を読み込んでいるのですが、PageA'
> の中のフォームデータ(INPUTタグのValue要素)の値がサーバ
> 側から降らせた新しい値ではなく、前回POSTした古い値が自動
> 的にセットされるという問題でした。
>
> > HTMLの中でほんの一部分だけ内容が変化した
>
> と書いた、一部分とはフォームデータのデフォルト値のことです。
>
> それはそれで未解決です。
>
> 2011年8月16日23:49 asaiarito <asai...@gmail.com

> <mailto:asai...@gmail.com>>:

> --
> このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送
> られています。
> このグループに投稿するには、android-...@googlegroups.com にメール
> を送信してください。
> このグループから退会するには、android-sdk-
> japan+un...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja
> からこのグループにアクセスしてください。

--
Keiji,
ml_an...@c-lis.co.jp

Reply all
Reply to author
Forward
0 new messages