<ユーザ認証>

すべてのリクエストに対して、認証の有無をチェックします。
セッション属性authがtrue(認証済)またはprocessing(認証中)であれば、chain.doFilterによって、そのままリクエストを呼びます。
未認証の場合は、元のURIをリクエスト属性に保存して、ログインページを呼びます。

(LoginFilter.java) ・ ・ public class LoginFilter implements Filter { private ServletContext context; private String forwardURI; public void init(FilterConfig config) throws ServletException { context = config.getServletContext(); forwardURI = config.getInitParameter("loginURI"); if (forwardURI == null) { throw new ServletException("ログインページが指定されていません"); } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest)request; HttpServletResponse httpResponse = (HttpServletResponse)response; HttpSession session = httpRequest.getSession(false); if (session != null) { String auth = (String) session.getAttribute("auth"); if ("true".equals(auth) || //"true" 認証済み "processing".equals(auth)) { //"processing" 認証中 //認証OK chain.doFilter(httpRequest, httpResponse); return; } session.removeAttribute("auth"); } //ログインページへforward forwardToLoginPage(httpRequest, httpResponse); } private void forwardToLoginPage(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { StringBuffer buf = request.getRequestURL(); String query = request.getQueryString(); if (query != null) { buf.append(query); } //元のURIを保存 String originalURI = new String(buf); request.setAttribute("originalURI", originalURI); request.getRequestDispatcher(response.encodeURL(forwardURI)).forward(request, response); } public void destroy() {} }

認証ページは、次の2種類があります。

(1)HTTPのBasic認証プロトコルを使う。

(LoginBasic.java) protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=Windows-31J"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); ServletContext context = getServletConfig().getServletContext(); //元のURIを取得 String originalURI = (String) request.getAttribute("originalURI"); //ユーザ名とパスワードが織り込まれているヘッダを取得する String authHeader = request.getHeader("authorization"); if (authHeader != null && authHeader.regionMatches(true, 0, "basic ", 0, 6) ) { //BASIC認証を指定されている場合はユーザ名とパスワードを抽出する String cred = MimeUtility.decodeText("=?iso-8859-1?B?" + authHeader.substring(6) + "?="); String user = cred.substring(0, cred.indexOf(":")); String pass = cred.substring(cred.indexOf(":") + 1); //認証処理 if (isValid(user, pass)) { //認証OK session.setAttribute("auth", "true"); response.sendRedirect(response.encodeRedirectURL(originalURI)); return; } } //ログイン未完了の場合はユーザ名とパスワードの入力を促す response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.setHeader("www-authenticate", "basic realm=\"Auth Test\""); out.println("認証が失敗しました"); } protected boolean isValid(String user, String password) { // 認証処理を定義する // (省略) //取り合えずの処理 if ("user".equals(user)) { return true; } else { return false; } } (web.xml) <filter> <filter-name>login</filter-name> <filter-class>filter.LoginFilter</filter-class> <init-param> <param-name>loginURI</param-name> <param-value>/servlet/filter.LoginBasic</param-value> </init-param> </filter>

(2)独自にログインフォームを用意する。

(login.jsp) ・ ・ <% // このフォームからのsubmitをフィルタ通過させるためのマーク session.setAttribute("auth", "processing"); %> <form method="post" action="/ServletTest/servlet/filter.Login"> ・ ・ ・ ・ <input type="hidden" name="originalURI" value="<%= request.getAttribute("originalURI") %>"> <input type="submit" value="ログイン"> </form> (Login.java) ・ ・ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String user = request.getParameter("user"); String password = request.getParameter("password"); //元のURIを保存 String originalURI = request.getParameter("originalURI"); if (!isValid(user, password)) { response.sendRedirect("../login_error.html"); return; } HttpSession session = request.getSession(); session.setAttribute("auth", "true"); response.sendRedirect(originalURI); } protected boolean isValid(String user, String password) { // 認証処理 if ("user".equals(user)) return true; //取り合えずの処理 return false; } (web.xml) <filter> <filter-name>login</filter-name> <filter-class>filter.LoginFilter</filter-class> <init-param> <param-name>loginURI</param-name> <param-value>/login.jsp</param-value> </init-param> </filter>