21.01.22 JSPCommunity 프로젝트(인터셉터에서 로그인 관련 정보를 req에 추가, 로그인 권 한체크 방식변경, SMTP발송 기능 구현)

2021. 1. 22. 18:29JAVA/JSP Community 사이트 프로젝트

<DispatcherServlet.java>

// 인터셉터
	private Map<String, Object> doBeforeAction(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");

		// 요청된 uri의 정보를 가져오기
		String requestURI = request.getRequestURI();
		// 가져온 uri의 정보를 /기준으로 쪼개기
		String[] requestUriBits = requestURI.split("/");

		// 만약, requestURIBits.length가 5보다 작으면
		// 즉, /jspCommunity/jsp/usr/article/list 와 같은 형식이 아니면 중지
		if (requestUriBits.length < 5) {
			response.getWriter().append("잘못된 요청입니다.");
			return null;
		}

		// DB 서버 연결
		MysqlUtil.setDBInfo("127.0.0.1", "sbsst", "sbs123414", "jspCommunity");

		String controllerTypeName = requestUriBits[2]; // usr or adm
		String controllerName = requestUriBits[3]; // article or member
		String actionMethodName = requestUriBits[4]; // doJoinForm or .....

		String actionUrl = controllerTypeName + "/" + controllerName + "/" + actionMethodName;

		// 세션에 로그인 정보 담기 시작
		int loginedMemberId = 0;
		boolean isLogined = false;
		Member loginedMember = null;

		HttpSession session = request.getSession();

		if (session.getAttribute("loginedMemberId") != null && (int) session.getAttribute("loginedMemberId") > 0) {
			loginedMemberId = (int) session.getAttribute("loginedMemberId");
			isLogined = true;
			loginedMember = Container.memberService.getMemberById(loginedMemberId);
		}

		request.setAttribute("loginedMemberId", loginedMemberId);
		request.setAttribute("isLogined", isLogined);
		request.setAttribute("loginedMember", loginedMember);
		// 세션에 로그인 정보 담기 끝

		// 로그인 필요한 action list 필터링 시작
		List<String> needToLoginActionList = new ArrayList<>();
		needToLoginActionList.add("usr/member/doLogout");
		needToLoginActionList.add("usr/article/doWriteForm");
		needToLoginActionList.add("usr/article/doWrite");
		needToLoginActionList.add("usr/article/doModifyForm");
		needToLoginActionList.add("usr/article/doModify");
		needToLoginActionList.add("usr/article/doDelete");

		/// 로그인 여부 확인
		if (needToLoginActionList.contains(actionUrl)) {
			if ((boolean) request.getAttribute("isLogined") == false) {
				request.setAttribute("alertMsg", "로그인 후 이용해 주세요.");
				request.setAttribute("replaceUrl", "../member/doLoginForm");

				RequestDispatcher rd = request.getRequestDispatcher("/jsp/common/redirect.jsp");

				rd.forward(request, response);

			}
		}
		// 로그인 필요한 action list 필터링 끝

		// 로그인 상태면 안되는 action list 필터링 시작
		List<String> needToNonLoginActionList = new ArrayList<>();
		needToNonLoginActionList.add("usr/member/doLoginForm");
		needToNonLoginActionList.add("usr/member/doLogin");
		needToNonLoginActionList.add("usr/member/doJoinForm");
		needToNonLoginActionList.add("usr/member/doJoin");

		/// 로그인 여부 확인
		if (needToNonLoginActionList.contains(actionUrl)) {
			if ((boolean) request.getAttribute("isLogined")) {
				request.setAttribute("alertMsg", "로그아웃 후 이용해 주세요.");
				request.setAttribute("replaceUrl", "../home/main");

				RequestDispatcher rd = request.getRequestDispatcher("/jsp/common/redirect.jsp");

				rd.forward(request, response);

			}
		}
		// 로그인 상태면 안되는 action list 필터링 끝
		

		Map<String, Object> rs = new HashMap<>();
		rs.put("controllerName", controllerName);
		rs.put("actionMethodName", actionMethodName);

		return rs;
	}

 

<ConfigServlet.java>

package com.sbs.example.jspCommunity.servlet;

import java.io.InputStream;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

import com.sbs.example.jspCommunity.container.Container;
import com.sbs.example.jspCommunity.service.EmailService;
import com.sbs.example.util.Util;

@WebServlet(name = "loadAppConfig", urlPatterns = {"/loadConfig"}, loadOnStartup = 1 )
//외부 고객이 들어오지 않을 서블릿
public class ConfigServlet extends HttpServlet{
		
	   	// 생성자, 서블릿 실행시 실행
		// 기본적으로 서블릿이 호출되면 실행됨
		//but, loadOnStartup = 1 이 붙으면 이 서블릿은 프로그램 실행시 자동으로 초기화가 진행됨(호출하지 않아도)
		@Override
		public void init(ServletConfig config) throws ServletException {
			super.init(config);
			
			//config.json 정보 얻어오기
			ServletContext context = getServletContext();
			InputStream inStream = context.getResourceAsStream("/META-INF/config.json");
			
			//jackson을 통해 config.json을 읽기
			Map<String, Object> configMap = Util.getJsonMapFromFile(inStream);
			
			//프로그램 실행 시 mail 관련 정보 가져오기(거의 처음 순서로 실행됨)
			String gmailId = (String) configMap.get("gmailId");
			String gmailPw = (String) configMap.get("gmailPw");
			
			EmailService emailService = Container.emailService;
			emailService.init(gmailId, gmailPw, "jspCommunity", "jspCommunity");
			
			//프로그램 실행하자마자 메일 발송(테스트)
			//emailService.send("juy32400@gmail.com", "메일 제목", "메일 내용");
		}

}

 

<QnA>

  • 서블릿은 기생프로그램이므로 Main이 없다.(즉, 앱이 실행되면 자동으로 실행되는 설정파일을 만들 수 없다.)
  • 앱이 켜지면 자동으로 실행되는 내용은 어디에? -> 설정용 서블릿
  • 왜 하필 /META-INF 폴더 안에 만들었나? -> 고객이 브라우저로 접근하지 못하도록 하기 위해서
  • Util.getJsonMapFromFile은 왜 필요한가?
     -> 설정파일을 java 소스코드에 넣으면, github에 나의 정보가 노출될 수 있다. 따라서 커밋 시 gitignore 할 파일을 따로 만들어 저장하고, Util.getJsonMapFromFile을 통해 읽도록 한 것