質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

3回答

4056閲覧

Ajaxの処理を中断し、サーバ側へ送信されないようにしたい

cham_danb

総合スコア3

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2020/05/08 01:50

編集2020/05/08 03:28

前提・実現したいこと

ajax通信を行うボタンを押下

JavaScriptでサーバ側のセッションをチェックする

セッションが切れていればajax通信を中断し、ログイン画面に遷移する

発生している問題・エラーメッセージ

ajaxでサーバ側のメソッドを呼び出して、セッションの情報を取得し、ログイン画面に遷移するようにはできました。
しかし、中断したい処理が動いてしまいます。

該当のソースコード

JavaScript

1//変数 2var timeoutFlg = 0; 3var jqXHR = new XMLHttpRequest; 4 5//ログインチェック 6function loginCheck() { 7 8 $.ajaxSetup({ 9 cache: false, 10 ifModified: true, 11 global: true // ajaxイベントをglobalで受け取る 12 }); 13  //ajax通信が始まった際に発火 14 $(document).ajaxStart(function () { 15 16 if (title !== "ログイン") { 17       //サーバ側のセッションをチェック 18 $.ajax( 19 { 20 type: 'POST', 21 url: '../LoginCheck', 22 async: false, 23 data: JSON, 24 success: function (data) { 25 //セッションが切れている場合 26 if (!data && timeoutFlg === 0) { 27 //フラグを立てる 28 timeoutFlg = 1; 29 //メッセージを出力し、ログイン画面に遷移 30 alert("タイムアウトしました。再度ログインしてください。"); 31 var form = document.createElement('form'); 32 form.setAttribute('action', '../Login'); 33 form.setAttribute('method', 'GET'); 34 form.style.display = 'none'; 35 // documentのBody部へ組み込ませる。 36 document.body.appendChild(form); 37 // submit送信 38 form.submit(); 39 } else { 40 timeoutFlg = 0; 41 } 42 } 43 }); 44 } 45 }); 46} 47 48//送信処理 49$('#Popup').dialog({ 50 modal: true, 51 width: 500, 52 height: 200, 53 title: '○○', 54 buttons: { 55 '○○': function () { 56       //ログインチェック実施 57 loginCheck(); 58 59       //セッションタイムアウトなら中断 60 if (timeoutFlg === 1) { 61 jqXHR.abort; 62 return false; 63 } 64 65 else { 66 jqXHR = $.ajax( 67 { 68 type: 'POST', 69 url: '../Req', 70 data: $('form').serialize(), 71 72 success: function (data) { 73 74 var result = data.Result; 75 var message = data.Message; 76 var redirectToUrl = "../△△"; 77 78 // メッセージを表示 79 alert(message); 80 81 // 異常終了の場合、処理を終了する 82 if (result === INT_RESULT_ERROR) { 83 return; 84 } 85 86 // ダイアログを閉じる 87 $('#Popup').dialog('close'); 88 89 // 画面遷移する 90 window.location.href = redirectToUrl; 91 }, 92 // サーバとの処理が失敗して処理が返ってきた後に実行するメソッド(error) 93 error: function (err) { 94 alert('error'); 95 return; 96 } 97 }); 98 99 } 100 }, 101 'キャンセル': function () { 102 // ダイアログを閉じる 103 $(this).dialog('close'); 104 } 105 } 106}); 107

試したこと

上記のように、ajax通信が始まった際に先にログインチェックを行い、timeoutFlgで下の処理をコントロールしようとしましたが、ダメでした。
画面遷移はしますが、下の送信処理は行われてしまいます。

DeveloperToolでデバッグを行ってみると、一度下の処理もリクエストが行われた後に、ajaxStartに入っているログインチェックが働いているようです。

どなたかお知恵をお貸しください。

補足情報(FW/ツールのバージョンなど)

VisualStadio2017
jQuery-3.2-1.js
※追記情報
ASP.NET MVC
.NET Framework 4.7.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/05/08 02:26

送っている途中のデータをとめたいのでしょうか? 送った後のデータがサーバーでどう処理されるかはサーバーの仕様次第だと思いますが
cham_danb

2020/05/08 02:37

そうです。送っている途中のデータを止めたいです。 ログインの状態をサーバ側ではチェックをしていないため、セッションが切れていてもデータが正常に送信されていると、サーバ側の処理が走ってしまいます。JavaScript側だけで行うのは不可能でしょうか?
退会済みユーザー

退会済みユーザー

2020/05/08 02:39

何を作っているのですか? ASP.NET と言っても Web Forms, MVC, WebPages, Razaor Page などいろいろあります。開発環境も書いてください。.NET なのか Core なのか、そのバージョンなど。
cham_danb

2020/05/08 03:06

情報が足らずすみません。作成しているのはMVCです。.NET Framework4.7.2を使用しています。
退会済みユーザー

退会済みユーザー

2020/05/08 03:08

その情報を質問欄を編集して追記願います。コメント欄は初期画面では開いてないので読まない人がいますから。
cham_danb

2020/05/08 03:29

ご指摘いただきありがとうございます。補足情報に追加いたしました。
guest

回答3

0

loginCheck以降の処理はloginCheckのsuccess: function (data) {内に書けばよいのでは。

js

1{ 2 '○○': function () { 3 loginCheck(); // この関数の中身は非同期で実行される 4 if (timeoutFlg === 1) { // timeoutFlgが1になることは無い 5 jqXHR.abort; 6 return false; 7 } 8 /* 後略 */ 9 } 10}

投稿2020/05/08 04:11

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cham_danb

2020/05/08 04:28

ご回答いただきありがとうございます。 たしかに…。その通りですね。気づきませんでした。 ただ、下のような処理はアプリケーションに何件もあり、今後の運用などを考えるとすべての処理に書いていくのは難しいかもしれません。
kei344

2020/05/08 04:34

loginCheck()が関数を引数に持てばできるでしょう。 function loginCheck( func ) { func(); } loginCheck( function (){ /* 処理 */ } );
cham_danb

2020/05/11 02:05

返信が遅くなり申し訳ございません。今回は別の方法で解決とさせていただきましたが、大変勉強になりました。今後活用させていただきます。ありがとうございました。
guest

0

ベストアンサー

セッションを確認するAPIを作り、データを送る前にチェックすればいいのでは?
送ったデータは止まらないので、送らないようにするのが賢明です

投稿2020/05/08 02:54

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/05/08 02:56

また、送られてくるデータを常に実行するのは攻撃に弱いということです 送られてきたものは信用せずに、条件が揃わない限り実行しない仕組みが必要でしょう (jsで送らなくするのはあくまでも補助)
cham_danb

2020/05/08 03:19

ご回答いただきありがとうございます。 そうですね。たしかにjsだけで管理するのはよくなさそうです。 当方まだ不勉強で、APIを作成するということが具体的にどのようなことなのかよくわかっておりません。 送られたデータをサーバ側でチェックして、処理を行うかどうか決める、ではなく クライアントからサーバ側に送信する前に、チェックをするということが可能なのでしょうか?
yambejp

2020/05/08 03:22

> クライアントからサーバ側に送信する前に、チェックをするということが可能なのでしょうか? セッションが継続しているかどうかは ・サーバーになにか問い合わせる ・特定のクッキーに紐付いてセッションが管理されているならそのクッキーを参照する のどちらかが有効でしょう
cham_danb

2020/05/08 03:51

ご回答いただきありがとうございます。 特定のクッキーに紐づいて管理されているわけではないので、サーバに問い合わせる方法がよさそうです。 JavaScriptだけでなんとかしようと思っていましたが、やはり厳しそうですね。
yambejp

2020/05/08 04:30

ASPのセッション管理の方法がよくわからないのですが クッキーなしでセッションを管理できるんですかね?
cham_danb

2020/05/08 08:23

申し訳ありません。そのあたりのことは当方の勉強不足でよく理解できていないようです。 ブラウザ側で管理をしていないから、クッキーで管理しているわけではないと認識しておりましたが、認識が間違っているでしょうか。もう少し調べます。
退会済みユーザー

退会済みユーザー

2020/05/08 22:06 編集

質問者さんの言うセッションというのが ASP.NET 標準の Session ということであれば (質問者さんはそうだと言ってますが実際のところは?です)、Session ID を送るのはクッキーを使う他に URL に埋め込むと言うオプションもあります。その可能性は低いですが。 また、Session の有効期限が切れていても、クッキーは削除されません。質問者さんによると Session をユーザー認証に使っているそうですが、クッキーの有無でユーザー認証が有効かどうかを判断することはできません。 ご参考まで。
cham_danb

2020/05/11 02:02

返信が遅くなり申し訳ございません。 コメントも含めて参考にさせていただいたので、こちらの回答をベストアンサーとさせていただきます。 サーバサイドの処理をJavaScriptでコントロールするのではなく、各コントローラーにOnActionExcutingメソッドをオーバーライドし、セッションが切れている場合に filterContext.Result = new RedirectResult("../別URL");としました。こうすることで、行う予定だった処理の向き先を変えてやるという形になっております。(この表現が正しくなければ申し訳ありません。当方の勉強不足です) もっとブラッシュアップはできると考えておりますが、ひとまずは解決とさせていただきます。 ご回答いただきありがとうございました。
guest

0

サーバー側は普通の ASP.NET アプリだと想像して・・・

とにかく何にせよまず最初に ajax を使っての要求は出して、そのあと何かの条件で abort しているように見えますが、そうなんですか?

であれば、サーバー側はそのまま処理を続けて応答を返すはずです。ブラウザ側ではその応答は無視するという動きになるはずです。

abort はブラウザ側だけの話(サーバーには何の影響も与えない)になるはずです。


【追記 2022/5/2】

今頃になって何ですが、よく調べてみると、

(1) ASP.NET 4.5 以降
(2) IIS 7.5 以降の統合モード
(3) サーバーで CancellationToken を受け取れば処理中断可能

・・・という条件が満足できれば、ブラウザの ✕ ボタンをクリックするとか Esc キーを押す、Ajax を使っての要求の場合は abort することでサーバー側の処理を中断する手段はありました。詳しくは以下の記事を見てください。

要求の中断による処理のキャンセル (MVC5)
http://surferonwww.info/BlogEngine/post/2021/07/12/handling-aborted-request-in-aspnet-mvc5-application.aspx

投稿2020/05/08 02:42

編集2022/05/02 01:00
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cham_danb

2020/05/08 03:09

ご回答いただきありがとうございます。 そうですね。abortしています。 SurferOnWww様の言う通り、サーバ側の処理はそのまま続いています。 ではabortをしてもサーバ側へのリクエストがキャンセルになるわけではないということなんですね。
退会済みユーザー

退会済みユーザー

2020/05/08 03:12

> ではabortをしてもサーバ側へのリクエストがキャンセルになるわけではないということなんですね。 そうです。abort する前に要求はサーバーに届いてしまっています。届いてしまってからではブラウザ側では何ともなりません。abort は先にも書きましたがブラウザ側だけの話で、ブラウザ側だけでなかったことにするだけです。
退会済みユーザー

退会済みユーザー

2020/05/08 03:47 編集

> JavaScriptでサーバ側のセッションをチェックする その「セッション」というのは何なのですか? ユーザーが認証されているか否かをセッションでチェックするのですか? 認証方式は何なのですか? ASP.NET Identity ですか、それとも独自認証?
cham_danb

2020/05/08 03:49

ユーザーが認証されているか否かのチェックです。ASP.NET Identityではありません。独自認証とは開発者が独自に作る認証のことであっていますか?それならば独自認証です。
退会済みユーザー

退会済みユーザー

2020/05/08 04:17 編集

初心者マークがついている質問者の方が独自に認証を実装するというのが信じられない話なのですが(セキュリティ上の重大な問題がありそうなので)、それはとりあえず置いといて・・・ その「セッション」というのは、普通に ASP.NET の HttpSessionState ということで良いのですか? どうも違うような気がするのですが・・・
cham_danb

2020/05/08 08:21

当方が実装したものではなく引継ぎ案件ではありますが、不勉強であるので難しく感じております。 はい、HttiSessionStateということです。
退会済みユーザー

退会済みユーザー

2020/05/08 21:42 編集

> 当方が実装したものではなく引継ぎ案件ではありますが そういうことですと話が通じないかもしれませんね。その Session でどのようにログイン中であることが判定できるか詳しく言えますか? それが言えないとすると引継ぎを受けた相手の方に聞くのが一番です。是非そうしましょう。ここで他人に聞くのは間違ってます。
退会済みユーザー

退会済みユーザー

2020/05/10 01:07

質問者さんが無言になてしまいましたが、どうするのでしょう? とにかく回答者のレスやコメントに対するフィードバックを返しましょう。分かった/分からなかった、役に立った/立たなかった、分からなかった or 役に立たなかったならどこがダメなのかぐらいはすぐ返せると思うのですが。 ギブアップしたので Q&A は止めるということならそれでもかまいませんので、その旨書いてこのスレッドはクローズしてください。 何にせよ無言は NG です。
cham_danb

2020/05/11 01:51

フィードバックが遅くなり申し訳ございません。 当方の事情により、回答が遅れてしまいました。 先ほどその後こちらでご回答していただいた内容を参考に解決することができました。 詳細に関してもご報告させていただきますので、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問