最近、私は本の購入ウェブサイトを書いていました。ログアウト関数をテストすると、ブラウザをクリックして戻ってブラウザを更新すると、すでにログアウトしたユーザーが再びログインしていることがわかります。
長い間考えていた後、オンラインで多くのソリューションを見つけましたが、オンラインで指定された方法のほとんどは、JSを使用してログアウトし、ユーザーがブラウザをクリックして戻ることを禁止することです。
この方法は実行可能ですが、バックグラウンドでこの問題を実際に解決しません。紳士を守っているように感じますが、悪役ではありません。
以下は、実装した方法です
原理:
ログアウトしたら、ブラウザをクリックして戻ってブラウザを更新します。実際、ブラウザは元のフォームの情報を再送信します。
ログアウトとは、元のセッションを殺すことを意味します
// private void logout(httpservletrequest request、httpservletresponse応答)をログアウトしますservletexception、ioexception {httpsession session = request.getsession(); request.setattribute( "sessionId"、session.getId()); session.removeattribute( "user"); session.invalidate(); Response.sendredirect(request.getContextPath() + "/index.jsp"); }ログアウト後にJSPページにリダイレクトすると、生成されたセッションは元のセッションとは異なります(JSPページのセッションはデフォルトで有効になります)
つまり、ログアウトした後、ブラウザをクリックしてセッションを更新するために戻ることは新しいセッションです。この観点から、解決策について考えてください。
元のセッションにデータを入れました。ログインしたときに初めてこのデータを取得できます。ログアウトした後、元のセッションはなくなりました。ブラウザをクリックしてリフレッシュします。新しいセッションにはデータはありません。得られた値はnullです
元のセッションのデータを新しいセッション値と一致させます。 1つには値があり、もう1つはnullです。マッチングは間違いなく失敗します。この時点で、ユーザーフレンドリーなプロンプトを提供し、ユーザーを再度ログインすることができます。
では、ログアウト後に元のセッションのデータを保存するにはどうすればよいですか(元のセッションがキャンセルされた場合、なくなります)。フォームに隠されたドメインを追加し、元のセッションにデータを隠されたドメインに配置することを検討してください。ログアウトしたら、ブラウザをクリックしてリフレッシュしてリフレッシュします。ブラウザは、自分で手動で保存することなく、元のセッションでデータを自動的に送信します(実際、手動で保存する必要がある場合があります。
フォームの繰り返しの提出に対するソリューションに少し似ていますが、同じセッションがログアウトの前後に同じセッションではないため、元のセッションのデータはここで排除することはできません。
詳細は次のとおりです。login.jsp
<%string token = new Random()。nextlong()+""; session.setattribute( "token"、token);%> <form action = "$ {pagecontext.request.contextpath}/clientervlet?operation = login" method = "post"> <table> <td "a rign =" ">"> name = "name"> </td> </tr> <tr> <td align = "right">パスワード:</td> <td> <入力タイプ= "パスワード" name = "password"> </td> </tr> <td> </td> <td> <td> <inputタイプ= " value = "$ {sessionscope.token}"> </form>サーブレットで、フレンドリーなプロンプトを与え、ログインページにリダイレクトします
httpsession session = request.getSession(); //ログアウト後にブラウザの繰り返しログインの問題を解決しますstring hiddentoken = request.getParameter( "token"); if(!hiddentoken.equals(sessiontoken)){request.setattribute( "message"、 "ログアウトして、もう一度ログインして、2秒後にログインページにターンしてください<メタhttp-equiv = 'refresh' = 2; url =" + request.getContextPath() + request.getRequestDispatcher( "/client/message.jsp")。戻る; }テスト:
ログイン
ログアウトしたら、ブラウザをクリックしてリフレッシュしてリフレッシュします。ブラウザは、データを再送信するかどうかを促します。
クリックして再送信します
これにより、ブラウザをクリックして戻ってユーザーを更新し、ログアウトした後に再度ログインする問題が解決します。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。