ログアウト後、ブラウザの「戻る」ボタンで前ページに戻っても、操作できない(ログイン画面に遷移させる)ようにしたいです。
サーブレットで簡単なショッピングサイトを作成しています。
URLでログイン画面(初期ページ)にアクセスし、ログイン認証後にショッピング機能を利用できます。
ログアウト時にremoveAttributeで全セッション(※カート情報のセッション以外)を削除し、
ログアウト後、ブラウザの「戻る」ボタンで直前のページに戻って操作しても、非ログイン状態(loginUserセッションがnull)なら初期ページに飛ばすという処理がしたいです。
下記のコードを参考にログインチェックフィルタを実装しました。
https://gist.github.com/blue-210/1a947e812e4c39ab7ddc
しかし、非ログイン状態でヘッダーのリンクから遷移すると真っ白な画面が表示されてしまいます(エラーは出力されません)。
GETリクエストだと上手くいかないのかと思ったのですが、ヘッダーのログアウトリンクはGETリクエストなのにちゃんと遷移できています。
期待通りログイン画面に飛ばすにはどうすればよいでしょうか?
よろしくお願いします。
LoginCheckFilter
1package filter; 2 3import java.io.IOException; 4 5import javax.servlet.Filter; 6import javax.servlet.FilterChain; 7import javax.servlet.FilterConfig; 8import javax.servlet.RequestDispatcher; 9import javax.servlet.ServletException; 10import javax.servlet.ServletRequest; 11import javax.servlet.ServletResponse; 12import javax.servlet.annotation.WebFilter; 13import javax.servlet.http.HttpServletRequest; 14import javax.servlet.http.HttpSession; 15 16@WebFilter(urlPatterns={"/AdminServlet","/AdminServlet2","/BuyItemServlet","/CartServlet","/RegisterServlet","/ShoppingServlet", 17 "/LoginServle"}) //フィルターを設定するサーブレットクラスを指定 18public class LoginCheckFilter implements Filter { 19 public void init(FilterConfig fConfig) throws ServletException { } //フィルタがインスタンス化された直後に実行 ※1 20 21 public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain) //設定したサーブレットクラスをリクエストしたとき 22 throws IOException, ServletException { 23 // セッションが存在しない場合NULLを返す ※引数がtrue:セッションが開始されてない場合、新しいセッションを返す 24 HttpSession session = ((HttpServletRequest)request).getSession(false); 25 26 if (session != null) { 27 // 何かしらセッションがある 28 Object loginCheck = session.getAttribute("loginUser"); 29 if (loginCheck == null) { 30 // loginCheckがnull→ログイン画面へ飛ばす 31 RequestDispatcher dispatcher = request.getRequestDispatcher("/LoginServlet"); 32 dispatcher.forward(request, response); 33 } else { 34 // loginCheckがある→通常どおり遷移 35 System.out.println("loginCheckセッションがある"); 36 chain.doFilter(request, response); 37 } 38 } else { 39 // セッションが何もない→ログイン画面へ飛ばす 40 System.out.println("★セッションがNull"); 41 RequestDispatcher dispatcher = request.getRequestDispatcher("/LoginServlet"); 42 dispatcher.forward(request, response); 43 } 44 45 } 46
header
1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 4 5<header> 6<%-- ログイン後、ヘッダには「ユーザー名」「注文履歴」「ログアウト」を共通で表示 --%> 7 <p>「${loginUser.userName}さん」 8 <c:if test="${loginUser.userName != 'admin'}"> 9 <a href="ShoppingServlet?action=history">注文履歴</a> 10 <a href="CartServlet">カート</a> 11 </c:if> 12 <a href="LoginServlet?action=logout" onclick="return confirm('ログアウトします。よろしいですか?')">ログアウト</a> 13 </p> 14</header>
●バージョン
Eclipse:2020-12 M1 (4.18.0 M1)
Java:11
●GitHubソースコード
https://github.com/G1tHub20/shopping
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。