ブラウザで画面を戻れないようにしたい

2020年9月14日 at 10:12

フォーラムの皆さま

 平素から大変お世話になっております。
現在、Expressと外部フォームを使った、WEBアンケートシステムを
構築しております。

【システム構造の概要】
1.concrete5のメンバーログイン後、各メンバーに応じたアンケート(現在A・Bの2種類)
のリンク先ボタンをメニュー画面に表示

2.メニュー画面でリンクボタンをクリックすると、各アンケートページ(外部フォーム)が
 表示されます。

3.アンケート回答後、「回答内容を確認する」と「メニュー画面に戻る」の2つのボタン
 をクリックすると、それぞれ、回答内容確認画面が表示される場合と、メニュー画面
 に移動できる場合とに分かれます。

4.アンケート回答確認画面では、「回答を確定する」と「アンケート画面に戻る」ボタン
 が表示され、「回答を確定する」ボタンをクリックしますと、まず、ログインユーザ
 を検証し、Expressへデータ登録後、回答内容をメールで送信する機能を実装しました。

5.4の処理が正常に終了すると、「アンケート回答ありがとうございます」メッセージが
 表示され、同時にメールが送信される仕組みです。
 また、「メニュー画面に戻る」ボタンも表示されます。

【困ったこと】
 上の工程5の「アンケート回答ありがとうございます」メッセージが表示された際に、
 ブラウザの戻るボタンをクリックした際、View側のコードにJavaScriptを追加しており、
 「ブラウザの戻るボタンをクリックしないでください」といったアラートを表示させて
 おり、閲覧履歴を追加しないようにしておりますが、その状態からブラウザの「進む」
 ボタンをクリックすると、もう一度「アンケート回答ありがとうございます」
 メッセージが表示され、空のメールが送信されてしまうことが分かりました。
 アンケートデータ側には、1回回答すると、「回答済」のフラグをExpressエンティティ
 に書き込んでおり、2重回答は回避できておりますが、空メールが飛んでしまうのは
 いただけないと思っております。
 そこで、コントローラ側の 「アンケート確定」処理コードに、ExpressのメンバーID
 と回答済フラグを見に行って、回答済となっている場合、メールも送信しないように
 書き換えてみましたが、ブラウザの「進む」ボタンクリック時にsubmitが発動しない
 のか、空メールがいまだとんでまいります。

【お聞きしたいこと】
 フォーラムの皆さまで、このような状況でどのように対処なさったご経験がおあり
 か、ぜひご教示頂ければ幸いです。
 アンケートの2重回答は防げておりますので、データ集計等には影響はございません
 が、空メールが飛んでくることは避けたいと思っております。

 ちなみに、ブラウザの「戻る」「進む」を何回も繰り返しましても、メールは、
 回答状況が記載された本メールと、空メールの2回しか飛んできません。
 10回繰り返して10回とんでくるのであれば、都度submitが発動されているのでは?
 と考えるのですが、どうにも状況が読めない状態でございます。

 どなた様か、お助けいただければ嬉しく存じます。
どうぞよろしくお願い申し上げます。

※メニュー画面等のイメージを添付しております。

# concrete5 Version
Core Version - 8.5.4
Version Installed - 8.5.4
Database Version - 20200609145307

# Database Information
Version: 5.1.73
SQL Mode:

# concrete5 Packages
CSV User Import & Export (0.1.1), Honest Websites Back To Top (1.1.0), Login/Logout Link (1.0), Manual Nav (2.3.3), Migration Tool (0.9.1)

# concrete5 Overrides
blocks/external_form/form/controller/tkp_menu.php, blocks/external_form/form/controller/enq_a.php, blocks/external_form/form/controller/enq_b.php, blocks/external_form/form/controller, blocks/external_form/form/tkp_menu.php, blocks/external_form/form/enq_a.php, blocks/external_form/form/enq_b.php, blocks/external_form/form, blocks/external_form, mail/mail_send_hyoka_a.php, mail/mail_send_hyoka_b.php

# concrete5 Cache Settings
Block Cache - Off
Overrides Cache - On
Full Page Caching - Off
Full Page Cache Lifetime - Every 6 hours (default setting).

# Server Software
Apache

# Server API
apache2handler

# PHP Version
7.1.33

# PHP Extensions
apache2handler, bcmath, bz2, calendar, Core, ctype, curl, date, dba, dom, enchant, exif, fileinfo, filter, ftp, gd, gettext, gmp, hash, iconv, imap, intl, json, ldap, libxml, mbstring, mcrypt, mysqli, mysqlnd, odbc, openssl, pcre, PDO, pdo_mysql, PDO_ODBC, pdo_pgsql, pdo_sqlite, pgsql, Phar, posix, pspell, recode, Reflection, session, shmop, SimpleXML, snmp, soap, sockets, SPL, sqlite3, standard, sysvmsg, sysvsem, sysvshm, tidy, tokenizer, wddx, xml, xmlreader, xmlrpc, xmlwriter, xsl, Zend OPcache, zip, zlib

# PHP Settings
max_execution_time - 3600
log_errors_max_len - 4096
max_file_uploads - 100
max_input_nesting_level - 64
max_input_time - 60
max_input_vars - 1000
memory_limit - 128M
post_max_size - 384M
sql.safe_mode - Off
upload_max_filesize - 256M
ldap.max_links - Unlimited
mysqli.max_links - Unlimited
mysqli.max_persistent - Unlimited
odbc.max_links - Unlimited
odbc.max_persistent - Unlimited
pcre.backtrack_limit - 1000000
pcre.recursion_limit - 100000
pgsql.max_links - Unlimited
pgsql.max_persistent - Unlimited
session.cache_limiter - no value
session.gc_maxlifetime - 7200
soap.wsdl_cache_limit - 5
opcache.max_accelerated_files - 4000
opcache.max_file_size - 0
opcache.max_wasted_percentage - 5

タグ:

Re: ブラウザで画面を戻れないようにしたい

2020年9月14日 at 13:11
フォーラムの皆さまへ

いつもお世話になっております。
このたび質問させていただいた件で、アンケート確定後、ブラウザの「戻る」ボタン
で画面を戻ろうとした後、「進む」ボタンをクリックして再度「アンケート回答
ありがとうございます」メッセージを表示させた際、回答内容が記載されていない
空メールが勝手に送信される件で、

コントローラ側のコードを再度見直し、
以下のように対処することで、何とか送信されなくなったようでございます。

【対処方法】
1.システムからユーザ情報を取得(ユーザ情報が取得できた場合2へ進む)

2.1で取得したユーザIDに紐づく受講科目一覧を、Expressの「受講科目」エンティティ
 より取得(データが1件以上あった場合、3に進む)

3.アンケート入力画面からPOSTされた科目IDを、2で取得したデータセットと照合
 する(見つかった場合4へ進む)

4.3で科目IDと、POSTされた科目IDが一致した場合、受講科目エンティティのフラグ
 フィールドのデータを取得して、値が「1」になっていない場合のみ、5へ移動

5.アンケートビューよりPOSTされた各回答データを「アンケートAまたはB」エンティティ
 に新規登録

6.「受講科目」エンティティの、該当するデータのフラグを「1」に変更

7.続けて、回答内容をメール送信

この結果、ブラウザの「戻る・進む」ボタンをクリックして、画面を再表示させまして
も、メールは1回しか飛んでこなくなりました。
おそらく、コントローラ側での処理コードでの条件分岐のコンテキストがおかしかった
のではないかと推察しております。

抽象的な質問内容で、大変申し訳ございませんでした。
また、大変お騒がせいたしまして、申し訳ございません。

そのようなわけで、自己解決いたしましたので、ご報告申し上げます。
クライアントサイドのブラウザ操作については、完全には防止できないと思いますので、
アラートを表示させ、画面上のボタンから操作を行うように案内しております。

今後ともなにとぞよろしくお願い申し上げます。