
現在、会員制のWebサービスを作成しています。
まだ初期段階ですが、今は管理者用のユーザー管理ページに着手しており、サーバーサイド、クライアントサイド合わせて、およそ7割程度完成しているいるところです。
このページの現時点での実装では、ユーザーの削除、復活、パスワードリセット、登録情報の変更、新規ユーザーの登録といった全機能でajaxを使っています。
また、処理対象のユーザーは一覧のテーブルをクリックして選択するのですが、このクリック時にサーバーからユーザーの詳細情報を取得しており、ここでもajaxを使っています。
要するに、1ページ取得したあと、そのページ内でサーバーと通信を行う必要が生じたら、それはすべてajaxを使うという決まりです。
そこで、ajaxの運用についていくつかわからない点があり、質問させて頂きます。
(1)
会員専用ページという性質を考えると、ajaxでリクエストを送信した際にも、サーバーサイドではそのリクエストに対するセッションが有効かどうかをチェックする必要がありますよね?
一般的な会員向けWEBサービスでは、"ページ遷移毎"だけでなく、"ajaxでの通信毎"でもセッションのチェックを行うものなのでしょうか。
(2)
ajaxでの通信時にセッションの有効性をチェックした結果、すでにタイムアウト等でセッションが無効な場合、一般的にはどうするべきなのでしょうか。
個人的にはlogoutページにリロードしたいと考えているのですが、このようにするには、サーバー側がレスポンスを返すときに、{error:{code:'1',message:'session_out'}}のようなJSONを返して、それをjavascript側で確認し、location.hrefを書き換える、というような流れで処理を行うことになるのでしょうか。
(3)
そもそも、今回のように「1ページ内で生じるサーバー間通信は全てajaxで補う」という考え方は、一般的なものなのでしょうか。
なにが言いたいかというと、"セキュリティ等を考慮してajaxを使うべきではない処理"と"ajaxを積極的に使うべき処理"(もしくは、"ajaxを使っても差し支えない処理")の判断の仕方、つまり、ajaxの使いドコロがよく分かっていません。
以上3点につきまして、ご教授いただければ幸いです。
No.3ベストアンサー
- 回答日時:
現在行っている実装をベースに回答させていただきます。
(1)もちろんyesです。
Ajaxリクエストであっても、基本的にセッションやクッキーの扱いは同じであり、通常通りの処理を行います。
(2)セッションの有効性チェックで強制リダイレクト、というのは通常の処理だと思います。
FuelPHPやASO.NET MVCでは、アクションの実行直前に必ず呼び出されるメソッド(フィルタ)がありますので、そちらで全部一括して処理します。
(3)Ajaxの利用は、方向性としては間違っていないです。
ただし、一口にAjaxといってもいくつか種類があり、
3-1・スキームをサーバサイドで自動生成するもの(基本JSを書かない)
3-2・ほとんど全部をjQuery等で処理する「ピュアAjax」
3-3・さらにAngularやKnockoutなど、javascriptフレームワークを使うもの。
この中の3-2の場合、javascriptによるインベントハンドラ定義・サーバ送信データのHTMLへの反映、入力値のajax形式送信、という問題をすべてjavascriptで行うと、UI(ユーザインターフェース)にガチガチに拘束されたコードになって、開発効率(生産性)が悪化、バグ耐性も低下して、改変が非常に難しくなっています。
現在、サーバサイド開発は、IDEやMVCフレームワークの台頭で、かなり開発生産性や保守効率が上がっているのですが、Ajaxは開発環境も含めて困難度が高く、対応できるエンジニアも少ないことから、knockoutJSやAngularのようなフレームワークが正しく導入運用できるまで、「力攻めの」javascriptAjax DOM操作は封印です。
サーバーサイドではFuelPHPを使って開発をしていたので、(1)、(2)はピンポイントな回答で非常に助かりました。
(3)に関しましては、こういったjavascriptフレームワークが存在していること自体知らず、ご提案いただいた中の3-2の方法で実装を進めていました。
javascript内に、イベントハンドラの定義とイベントをバインドする要素を直接記述しなければならず、確かにおっしゃる通りJavascriptへの依存度の高く「あまり美しくないな」と思っていました。
とりあえずknockout.jsについて調べてみたのですが、一切javascript上でDOM操作をせずにHTMLの更新ができたり、HTMLと処理部分を上手く分離できるなど、一気に開発・保守の効率が高まりそうですね。
AngularJSについても調べてみようと思います。
期待していたよりもレベルの高いご回答をいただき、非常に勉強になりました。
本当にありがとうございます。
No.2
- 回答日時:
個人的な考えです
1) AJAXのサーバー側チェック
基本的に「クライアントは絶対に信じるな」が合言葉ですので、
遷移だろうが非同期だろうが関係なく、
HTTPで受け付ける要求は全て厳格なチェックを行ってください。
2) AJAXのエラー処理
エラー用のJSONを返すもよろしいですが、
HTTP応答で 403 Forbidden を返し、AJAX のエラーイベントで処理するのも手です。
3) AJAXの使いどころ
セキュリティの点では何の問題もないと思います。
なので、業務目的と使い勝手で選択すべきかと思います。
・古い環境を考慮するなら、画面遷移のみ
・画面のごく一部だけ書き換えたいならAJAX
・画面入力状態を保持したままPOST送信したいならAJAX
・ただし業務的に重要な操作なら、入力・確認・完了と画面遷移
・表示系機能でブラウザの戻る(巻き戻す)機能を重視するなら画面遷移
・サーバー側処理が非常に重い業務ならAJAX
・再利用できる画面部品の処理ならAJAX
非常に有用なご回答をいただき、本当に有難うございます。
(1)
やはりそうですよね…。
自分でも「常識的に考えてチェックは必須だよなぁ」とは思っていたのですが、改めてご回答をいただき、自信をもつことが出来ました。
(2)
なるほど、レスポンスコードでエラーを表現するという手法は凄くよさそうですね。是非とも活用してみたいと思います。
(3)
これは非常に参考になります。
こういった「判断基準」に関する情報が全然なかったので、是非とも参考にさせて頂きます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript プラグイン無しでContactform7にdatepickerを実装 3 2022/10/25 02:18
- PHP 掲示板のセキュリティについてアドバイスお願い致します 1 2023/08/11 20:44
- VPN フリー wi-fi は安全ですか 自宅での wi-fi VPNを使用したら良い? 2 2022/05/31 04:12
- ネットワーク OSI参照モデルの各層の役割がわかりません。 3 2023/04/21 21:12
- サーバー メールサーバーについて詳しい方、メールサーバーの管理業務経験のある方、教えてください。 3 2022/11/12 18:24
- その他(セキュリティ) 役所など、情報系システムのセキュリティが弱くても業務システムに問題ないか 3 2022/11/02 16:38
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- PHP $_SESSIONに渡した後はそのまま使っても問題ありませんか? 3 2022/11/08 22:17
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- Gmail SPFレコードとDNSサーバーについて、gmailを設定できるかどうか 2 2023/06/10 23:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイル 特定ウインドウ...
-
GASでスプレッドシートの一番上...
-
入力フォームの値をQRコードで...
-
正規表現で、特定の文字列を含...
-
1枚の画像をクリックすると複数...
-
ワードでA3横の画面にして、文...
-
ダブルクリックと2回クリックの...
-
C言語のflagの使い方が分かりま...
-
php コールバック関数
-
ナイトボットのAliasについて
-
これってなんの電話かわかりま...
-
VBAでクイズゲームの作り方
-
以下のURL入れますか?皆さんは↓
-
画像のドットの部分が抜けてい...
-
Chinapost こよパズルどう動か...
-
非同期通信で掲示板を作る際の...
-
非同期通信を使うタイミングが...
-
PYTHONのtkinterについて
-
Pythonのtkinterについて
-
Pythonを勉強する道のり
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
8ビットダウンカウンタをVerilo...
-
AJAX通信が終わるまで次の処理...
-
非同期関数とノンブロッキング...
-
AJAX通信で、ボタンをクリック...
-
wininet.dllのInternetOpenの同...
-
Javadcriptでwebサーバー側にあ...
-
各種APIを使ってwebサービスを...
-
OVERLAPPED構造体が分かりませ...
-
JK-FFを使う非同期10進・2進カ...
-
SRAM製品の同期・非同期の違い
-
AJAX通信のエラー処理について
-
phpとajaxの比較
-
C#でUDP通信
-
Ajax非同期通信の多重リクエス...
-
CPU I/Oポート 通信 モニタ
-
サイトのデータ(HTML)を取得
-
非同期接続について質問です
-
ExcelVBAで非同期のsocket通信...
-
AJAXとSEO。同期通信とPHP送信...
-
RS-232Cの通信方式に関して。
おすすめ情報