プログラミング初心者で学習の為、ログイン機能をSpring securityを使用せずに実装しています。
アクセス中のユーザのログイン情報がセッション中に存在するか確認し、
存在しない場合は他ページにアクセスした場合もすべてTOPページにリダイレクトする処理を
実装したいと考えております。
フィルターを追加したところ、どのURLにアクセスしても
HTTP Status 404 – Not Found
とエラーが表示されました。
リクエストURLが「ログイン画面への遷移処理の場合、
ログインチェックを実施しない」設定をしましたが、その箇所が上手く動いていないという事でしょうか?
原因が知りたいです。
◆フィルター
package jp.co.sss.book.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Component; @Component public class LoginCheckFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // ServletRequest 型のリクエスト情報を HttpServletRequest 型 // (サブクラスの型)にキャストする HttpServletRequest httpRequest = (HttpServletRequest) request; String requestURL = httpRequest.getRequestURI(); if (requestURL.endsWith("/")) { // リクエスト URL が「ログイン画面への遷移処理」、 // 「ログイン処理」宛ての場合、ログインチェックを実施せず、 // リクエスト対象のコントローラの処理に移る chain.doFilter(request, response); } else { // セッション情報を取得 HttpSession session = httpRequest.getSession(); // セッション情報からユーザのログイン情報(ユーザ ID)を取得 Integer bookUserId = (Integer) session.getAttribute("bookUserId"); if (bookUserId == null) { // ログイン情報が存在しない場合(ログイン ID が null の場合)、 // ログイン画面にリダイレクトする // ServletResponse 型のリクエスト情報を // HttpServletResponse 型(サブクラスの型)にキャストする HttpServletResponse httpResponse = (HttpServletResponse) response; // ログイン画面にリダイレクトする httpResponse.sendRedirect("/"); } else { // ログイン情報が存在する場合 // (ログイン ID に何らかの文字列が保存されている場合)、 // リクエスト対象のコントローラの処理に移る chain.doFilter(request, response); } } } }
◆コントローラ
package jp.co.sss.book.controller; import javax.servlet.http.HttpSession; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import jp.co.sss.book.entity.BookUser; import jp.co.sss.book.form.LoginForm; import jp.co.sss.book.repository.BookUserRepository; @Controller public class SessionController { @Autowired private BookUserRepository userRepository; // // @RequestMapping("/") // public String index() { // return "index"; // } @RequestMapping("/") public String index(@ModelAttribute LoginForm form) { return "index"; } //ログイン(入力チェック実装) @RequestMapping(path = "/book/login", method = RequestMethod.POST) public String doLogin(@Valid @ModelAttribute LoginForm form, BindingResult result, HttpSession session, Model model) { int userId = form.getBookUserId(); String password = form.getPassword(); BookUser user = userRepository.findByBookUserIdAndPassword(userId, password); if (user != null) { session.setAttribute("userName", user.getBookUserName()); // TODO 下記コードを、書籍一覧表示用のビューにリダイレクトするように編集してください。 return "redirect:/book/findAll"; } else { model.addAttribute("errMessage", "ユーザID、またはパスワードが間違っています。"); return "index"; } } @RequestMapping(path = "/logout", method = RequestMethod.GET) public String logout(HttpSession session) { // セッションの破棄 session.invalidate(); return "redirect:/"; } }
◆フォーム
package jp.co.sss.book.form; import javax.validation.constraints.Max; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; public class LoginForm { @NotNull @Max(value = 5) // @Pattern(regexp = "^[0-9]+$") private int bookUserId; @NotBlank @Size(max = 16) @Pattern(regexp = "^[a-zA-Z0-9]+$") private String password; public int getBookUserId() { return bookUserId; } public void setBookUserId(int bookUserId) { this.bookUserId = bookUserId; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/24 07:39
2021/09/24 11:20