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 접속시
728x90
반응형