21.01.22 JSPCommunity 프로젝트(인터셉터에서 로그인 관련 정보를 req에 추가, 로그인 권 한체크 방식변경, SMTP발송 기능 구현)
2021. 1. 22. 18:29ㆍJAVA/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을 통해 읽도록 한 것