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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

フィルタ

フィルタとは、特定の条件に合わせてデータへのアクセスをブロックするプログラムやルーチンを指します。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

4978閲覧

サーブレットフィルタのログインチェック

Okam0chan

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

フィルタ

フィルタとは、特定の条件に合わせてデータへのアクセスをブロックするプログラムやルーチンを指します。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2021/07/24 02:55

編集2021/08/09 00:55

ログアウト後、ブラウザの「戻る」ボタンで前ページに戻っても、操作できない(ログイン画面に遷移させる)ようにしたいです。

サーブレットで簡単なショッピングサイトを作成しています。
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

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

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

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

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

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

guest

回答1

0

自己解決

フォワード先のLoginServletにおいて、
WEB-INF内のJSPファイルに対してリダイレクトしようとしたのが原因でした。
対象JSPをWebContent直下(WEB-INFの外)に配置することで解決しました。

投稿2021/08/13 06:25

編集2021/08/13 06:46
Okam0chan

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問