10

JSPには次のコードがあります。

<%
    if(session.getAttribute("Username") == null || session.getAttribute("Username") == "_INVALID_")
    {
        response.sendRedirect("LoginPage.html");
    }
%>

<form>
    <input type="button" value="Change Account Details" onClick="location.href='ChangeDetails.jsp'">
    <br></br>
    <input type="button" value="Add Customers" onClick="location.href='AddCustomers.jsp'">
    <br></br>
    <input type="button" value="Manage Flights" onClick="location.href='ManageFlights.jsp'">
    <br></br>
    <input type="button" value="Book Flights" onClick="location.href='BookFlights.jsp'">
    <br></br>
    <input type="button" value="Log Out" onClick="location.href='LoginPage.html'">
</form>

ユーザーがログアウトボタンをクリックしたときに、ユーザーをログインページにリダイレクトして、現在のセッションを強制終了します。リダイレクト部分は成功しましたが、セッションを強制終了する方法がわかりません。どうすればこれを行うことができますか?

4

3 に答える 3

22

現在のセッションを強制終了するには、基本的HttpSession#invalidate()に、ログインまたはメインページへのリダイレクトを呼び出して実行する必要があります。このコードは、POSTリクエストによって呼び出されるサーブレットdoPost()のメソッドに配置されることになっています。

例えば

<form action="${pageContext.request.contextPath}/logout" method="post">
    <input type="submit" value="Logout" />
</form>

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getSession().invalidate();
        response.sendRedirect(request.getContextPath() + "/LoginPage.html");
    }

}

具体的な問題とは関係なく、ユーザー名チェックコードが適切な場所にありません。すべてのJSPページに同じコードをコピーペーストするべきではありません。このジョブは、サーブレットフィルタの1か所で実行する必要があります。JSPファイルのJavaコードは、可能な限り避ける必要があります。

さらに、エンドユーザーがブラウザの戻るボタンを使用して履歴に戻ると、別の潜在的な問題が発生します。デフォルトでは、ブラウザはすべての応答をキャッシュするため、戻るボタンは、サーバーに直接新しいものを要求する代わりに、ブラウザのキャッシュからページを表示する場合があります。これを修正するには、この関連する質問を参照してください。ログアウト後に以前にアクセスした保護されたページがユーザーに表示されないようにする

最後になりましたが、非常に奇妙なHTMLがいくつかあります。onClickナビゲートするためのボタン?ユーザーとSEOがいかに不親切か。<a>代わりに通常のリンクを使用してください。ボタンのルックアンドフィールについては、CSSを挿入してください。

于 2012-12-04T16:30:24.223 に答える
2

HttpSessionのinvalidate()メソッドを見てください。セッションは HttpServletRequest getSession()メソッドを介して取得できます。

次のように、Expires、Cache-Control、Pragma http ヘッダーも確認する必要があります

于 2012-12-04T16:23:37.263 に答える