今回は、「Webシステムのログイン(4)―ログインしてブックマークに遷移する―」です。
前回、直接ブックマークなどで飛んできたときに、ログイン画面へリダイレクトしました。
今回は、ログインが終わったときに、さらに飛んできたURLへ戻るようにしてみます。
■動画はこちら
■動画で使用しているソースコード
ソースコードが多いので、主要なコードのみ載せています。
他に欲しいソースコードがありましたら、youtubeのコメント欄へどうぞ。
サーブレットフィルター(LoginFilter.java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | package yurufuwa.prog.sample; import java.io.IOException; import java.net.URLEncoder; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpFilter; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; public class LoginFilter extends HttpFilter { @Override protected void doFilter( HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { //セッションからユーザIDを取り出す HttpSession session = request.getSession(false); String userId = null; if(session != null) { userId = (String)session.getAttribute("USER_ID"); } if (userId != null) { //ログイン済みなので、サーブレットを呼び出す chain.doFilter(request, response); } else { //このリクエストのURL(ブックマークのURL)を取得 String url = request.getRequestURL().toString(); if(request.getQueryString() != null) { url += "?" + request.getQueryString(); } //未ログインなので、ログイン画面へリダイレクト response.sendRedirect( "./login?redirecturl=" + URLEncoder.encode(url, "UTF-8") ); } } } |
ログインサーブレット(LoginServlet.java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | package yurufuwa.prog.sample; import java.io.IOException; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //パラメータ(リダイレクトURL)の取得 String redirectUrl = req.getParameter("redirecturl"); if(redirectUrl != null && redirectUrl.length() != 0) { //リクエストにリダイレクトURLをセット req.setAttribute("REDIRECT_URL", redirectUrl); } //ログインページを表示 ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher("/WEB-INF/jsp/login.jsp"); rd.forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //入力パラメーターを取得 String userId = req.getParameter("txtUserId"); String password = req.getParameter("txtPassword"); String redirectUrl = req.getParameter("redirectUrl"); //ユーザIDとパスワードのチェック LoginChecker checker = new LoginChecker(); if( checker.isValid(userId, password) ) { //セッションを作成して、ユーザID、ユーザ名を追加 HttpSession session = req.getSession(true); session.setAttribute("USER_ID", userId); session.setAttribute("USER_NAME", checker.getUserName()); //リダイレクト if(redirectUrl != null && redirectUrl.length() != 0) { //ブックマークのURLへリダイレクト resp.sendRedirect(redirectUrl); } else { //メニューへ resp.sendRedirect("./menu"); } } else { //ログインのエラーページを表示 ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher("/WEB-INF/jsp/login_err.jsp"); rd.forward(req, resp); } } } |
ログインJSP(login.jsp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String redirectUrl = (String)request.getAttribute("REDIRECT_URL"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ログイン</title> <link href="./css/style.css" rel="stylesheet" /> </head> <body> <header class="header"> <div class="header_title">ログイン</div> <div class="header_add"></div> </header> <main class="login"> <h2>ログイン</h2> <form action="./login" method="post"> <table> <tr><td>ユーザID</td><td><input type="text" name="txtUserId" /></td></tr> <tr><td>パスワード</td><td><input type="password" name="txtPassword" /></td></tr> </table> <br /> <% if(redirectUrl != null) { %> <input type="hidden" name="redirectUrl" value="<%= redirectUrl %>" /> <% } %> <input type="submit" value="ログイン" /> </form> </main> </body> </html> |
web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" id="WebApp_ID" version="5.0"> <display-name>testWeb</display-name> <servlet> <servlet-name>Login</servlet-name> <servlet-class>yurufuwa.prog.sample.LoginServlet</servlet-class> </servlet> <servlet> <servlet-name>Menu</servlet-name> <servlet-class>yurufuwa.prog.sample.MenuServlet</servlet-class> </servlet> <servlet> <servlet-name>Logout</servlet-name> <servlet-class>yurufuwa.prog.sample.LogoutServlet</servlet-class> </servlet> <servlet> <servlet-name>Todofuken</servlet-name> <servlet-class>yurufuwa.prog.sample.TodofukenServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Menu</servlet-name> <url-pattern>/menu</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Logout</servlet-name> <url-pattern>/logout</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Todofuken</servlet-name> <url-pattern>/todofuken</url-pattern> </servlet-mapping> <filter> <filter-name>LoginFilter</filter-name> <filter-class>yurufuwa.prog.sample.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/menu</url-pattern> </filter-mapping> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/todofuken</url-pattern> </filter-mapping> </web-app> |