JAVA/JAVA개발자 양성과정

[JSP] 코딩 피드백 - filter을 이용한 인증기능 구현 (GET / Redirect방식 ➡ setAttribute/forward 방식)

728x90
반응형

filter을 이용한 인증기능 구현

로그인되어있는 회원은 hello페이지에 접근 가능하지만, 비 로그인 회원은 로그인 페이지로 이동한다.

로그인 후에는 로그인요청이 필요했던 이전 페이지로 이동한다.

 

 

 

 

🔽 내가 작성한 코드 - 요청  URL생성시 GET / Redirect방식

hello.jsp ➡ Authfilter.java ➡ loginForm.jsp ➡ loginProc.jsp

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class AuthFilter implements Filter {

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpSession session = ((HttpServletRequest) request).getSession();
		String userId = (String) session.getAttribute("userId");

		// 비회원 접근시 로그인페이지로 이동
		if (userId != null) {
			chain.doFilter(request, response);
		} else {
        	String query = ((HttpServletRequest)request).getQueryString();🚀
        if(query == null) {
            query = "";
        }else {
            query = "?" + query;
        }

        String url = ((HttpServletRequest)request).getRequestURL().toString() + query;🚀
        String encodeUrl = URLEncoder.encode(url, "UTF-8");🚀
        ((HttpServletResponse)response).sendRedirect(((HttpServletRequest)request).getContextPath() + "/loginForm.jsp?url=" + encodeUrl);🚀
        }
	}

}

 

hello.jsp ➡ Authfilter.java ➡ loginForm.jsp ➡ loginProc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page session="false" %>
    
    <% 
    String url = (String)request.getParameter("url"); 🚀
    %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>session</title>
</head>
<body>
	<%-- 세션일때는 아래코드 --%>
	<form onsubmit="return false" id="form">
		<% if(url != null) { %><input type="hidden" name="url" value="<%=url %>" id="url"> <% } %>
		<label for="id">아이디 :</label><input type="text" name="id" id="id"><br>
		<label for="pwd">비밀번호 :</label><input type="password" name="pwd" id="pwd"><br>
		<button type="reset" id="resetBtn">취소</button>
		<button id="submitBtn">로그인</button>
	</form>
	
	<script>
		const form = document.getElementById("form");
		const id = document.getElementById("id");
		const pwd = document.getElementById("pwd");
		const submitBtn = document.getElementById("submitBtn");
		

		submitBtn.addEventListener("click", function () {
			if (id.value.trim() == "") {
				alert("아이디를 입력하세요.");
				id.focus();
				return false;
			}
			if(pwd.value.trim() == ""){
				alert("비밀번호를 입력하세요.");
				pwd.focus();
				return false;
			}

			form.action = "<%=request.getContextPath()%>/loginProc.jsp";
			form.mothod = "POST";
			form.submit();
		})
	</script>
</body>
</html>

 

hello.jsp ➡ Authfilter.java ➡ loginForm.jsp ➡ loginProc.jsp

<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page session="true" %>
<%-- session ture로 하면 브라우저마다 세션을 생성한다.--%>

<%

	//1.아이디와 비밀번호를 구한다.
	String id = request.getParameter("id");
	String pwd = request.getParameter("pwd");
	String url = request.getParameter("url");
	//2.회원여부를 확인한다.
	boolean isMember = true;
	
	if(isMember){
		//세션을 생성한다.
		session.setAttribute("userId", id); 
		
		if(url == null){
			response.sendRedirect(request.getContextPath() + "/loginSuccess.jsp");
		}else{
			String decodeUrl = URLDecoder.decode(url, "UTF-8");🚀
			response.sendRedirect(decodeUrl);🚀
		}
	}else{
		response.sendRedirect(request.getContextPath() + "/loginForm.jsp");
	}
%>

 



 

 

🔽 선생님 피드백 - 요청  URL생성시 setAttribute/forward 방식

- 요청URL주소를 전달하는 방식을 (GET / Redirect방식 ➡ setAttribute/forward 방식) 다르게 하셨다.

장점 : 주소에 return주소가 출력되지 않아 깔끔하다.

 

hello.jsp ➡ Authfilter.java ➡ loginForm.jsp ➡ loginProc.jsp

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class AuthFilter implements Filter {

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpSession session = ((HttpServletRequest) request).getSession();
		String userId = (String) session.getAttribute("userId");

		// 비회원 접근시 로그인페이지로 이동
		if (userId != null) {
			chain.doFilter(request, response);
		} else {
			HttpServletRequest req = ((HttpServletRequest) request);
			String url = req.getServletPath();🚀

			String query = ((HttpServletRequest) request).getQueryString();
			if (query == null) {
				url = "";
			} else {
				url += "?" + query;
			}

			// 요청값에 setAttribute로 요청url주소를 저장한다.
			request.setAttribute("url", url);🚀
			
			// 설정한 setAttribute를 다음 페이지에서 사용하기위해 포워딩 방식을 사용한다.
			RequestDispatcher dispatcher = request.getRequestDispatcher("/loginForm.jsp");🚀
			dispatcher.forward(request, response);🚀
		}
	}

}

 

hello.jsp ➡ Authfilter.java ➡ loginForm.jsp ➡ loginProc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page session="false" %>
    
    <% 
    String url = (String)request.getpAttribute("url");🚀
    %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>session</title>
</head>
<body>
	<%-- 세션일때는 아래코드 --%>
	<form onsubmit="return false" id="form">
		<% if(url != null) { %><input type="hidden" name="url" value="<%=url %>" id="url"> <% } %>
		<label for="id">아이디 :</label><input type="text" name="id" id="id"><br>
		<label for="pwd">비밀번호 :</label><input type="password" name="pwd" id="pwd"><br>
		<button type="reset" id="resetBtn">취소</button>
		<button id="submitBtn">로그인</button>
	</form>
	
	<script>
		const form = document.getElementById("form");
		const id = document.getElementById("id");
		const pwd = document.getElementById("pwd");
		const submitBtn = document.getElementById("submitBtn");
		

		submitBtn.addEventListener("click", function () {
			if (id.value.trim() == "") {
				alert("아이디를 입력하세요.");
				id.focus();
				return false;
			}
			if(pwd.value.trim() == ""){
				alert("비밀번호를 입력하세요.");
				pwd.focus();
				return false;
			}

			form.action = "<%=request.getContextPath()%>/loginProc.jsp";
			form.mothod = "POST";
			form.submit();
		})
	</script>
</body>
</html>

 

hello.jsp ➡ Authfilter.java ➡ loginForm.jsp ➡ loginProc.jsp

<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page session="true" %>
<%-- session ture로 하면 브라우저마다 세션을 생성한다.--%>

<%

	//1.아이디와 비밀번호를 구한다.
	String id = request.getParameter("id");
	String pwd = request.getParameter("pwd");
	String url = request.getParameter("url");
	//2.회원여부를 확인한다.
	boolean isMember = true;
	
	if(isMember){
		//세션을 생성한다.
		session.setAttribute("userId", id); 
		
		if(url == null){
			response.sendRedirect(request.getContextPath() + "/loginSuccess.jsp");
		}else{
			response.sendRedirect(request.getContextPath() + url);🚀
		}
	}else{
		response.sendRedirect(request.getContextPath() + "/loginForm.jsp");
	}
%>

http://localhost:8080/jspWebApp/hello.jsp?a=1 접속시

forwarding방식이기에 주소가 바뀌지 않고 loginForm.jsp화면이 출력된다.
input에서 요청 url경로가 올바르게 출력되었다.

 

728x90
반응형