Spring에서 FrontController는 DispatcherServlet이라고 함.
공통로직을 작성하여 DispatcherServlet을 통한다음 다른 페이지에 접속하도록 코드 작성

1. 보안에 취약

DispatcherServlet
package com.example.userapp.conpig; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; // FrontController @WebServlet("*.do") public class DispatcherServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 공통로직 System.out.println("common logic~~"); resp.setHeader("Content-Type", "text/html; charset=utf-8"); // 2. 분기 String uri = req.getRequestURI(); System.out.println(uri); if(uri.equals("/join-form.do")){ resp.sendRedirect("/user/join-form.jsp"); } else if (uri.equals("/join.do")) { resp.sendRedirect("/user/join.jsp"); } else if (uri.equals("/main.do")) { resp.sendRedirect("/board/main.jsp"); } else { resp.setStatus(404); resp.getWriter().println("잘못된 페이지를 입력하셨습니다."); } } }
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>main page</h1> <hr> </body> </html>
join.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% response.setHeader("Content-Type", "text/html; charset=utf-8"); // 한글 처리 // 1. 파싱 String username = request.getParameter("username"); String password = request.getParameter("password"); String email = request.getParameter("email"); System.out.println("username : " + username); System.out.println("password : " + password); System.out.println("email : " + email); // 2. 유효성 검사 (1000줄 됨) if (username.length() < 3 || username.length() > 10) { response.getWriter().println("<h1>username 글자수가 3~10여야 합니다.</h1>"); return; } response.setStatus(302); response.setHeader("Location","/board/main.jsp"); response.setHeader("clock","/12pm"); %>
join-form.jsp
<%@ page import="java.time.LocalDateTime" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% LocalDateTime now = LocalDateTime.now(); %> <html> <head> <title>Title</title> </head> <body> <h1>회원가입 페이지 <%=now%></h1> <hr> <form action="/WEB-INF/user/join.jsp" method=""> <input type="text" placeholder="username" name="username"> <input type="text" placeholder="password" name="password"> <input type="text" placeholder="email" name="email"> <button>회원가입</button> </form> </body> </html>
외부에서 접근이 가능해서 DispatcherServlet을 거치지않고도 접속이 가능 /join-form.do를 입력해서 들어가야 하는데 /user/join-form.jsp 이걸로 바로 접속이가능함(강제성을 부여해줘야함)
2. 강제성 부여
내부적으로 요청하여 보안폴더(WEB-INF)에 접근이 가능하게 코드 작성

DispatcherServlet
package com.example.userapp.conpig; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; // FrontController @WebServlet("*.do") public class DispatcherServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 공통로직 System.out.println("common logic~~"); resp.setHeader("Content-Type", "text/html; charset=utf-8"); // 2. 분기 String uri = req.getRequestURI(); System.out.println(uri); if(uri.equals("/join-form.do")){ //resp.sendRedirect("/WEB-INF/user/join-form.jsp"); req.getRequestDispatcher("/WEB-INF/user/join-form.jsp").forward(req,resp); } else if (uri.equals("/join.do")) { //resp.sendRedirect("/WEB-INF/user/join.jsp"); req.getRequestDispatcher("/WEB-INF/user/join.jsp").forward(req,resp); } else if (uri.equals("/main.do")) { //resp.sendRedirect("/WEB-INF/board/main.jsp"); req.getRequestDispatcher("/WEB-INF/board/main.jsp").forward(req,resp); } else { resp.setStatus(404); resp.getWriter().println("잘못된 페이지를 입력하셨습니다."); } } }
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>main page</h1> <hr> </body> </html>
join.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% response.setHeader("Content-Type", "text/html; charset=utf-8"); // 한글 처리 // 1. 파싱 String username = request.getParameter("username"); String password = request.getParameter("password"); String email = request.getParameter("email"); System.out.println("username : " + username); System.out.println("password : " + password); System.out.println("email : " + email); // 2. 유효성 검사 (1000줄 됨) if (username.length() < 3 || username.length() > 10) { response.getWriter().println("<h1>username 글자수가 3~10여야 합니다.</h1>"); return; } response.setStatus(302); response.setHeader("Location","/main.do"); response.setHeader("clock","/12pm"); %>
join-form.jsp
<%@ page import="java.time.LocalDateTime" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% LocalDateTime now = LocalDateTime.now(); %> <html> <head> <title>Title</title> </head> <body> <h1>회원가입 페이지 <%=now%></h1> <hr> <form action="/join.do" method="post"> <input type="text" placeholder="username" name="username"> <input type="text" placeholder="password" name="password"> <input type="text" placeholder="email" name="email"> <button>회원가입</button> </form> </body> </html>
Share article