21.01.25 JSPCommunity 프로젝트(아이디,비번 찾기, 비번 해시암호화, 임시비번 메일발송, ResultData 객체 도입, 게시물 총 수, 게시물 검색기능(진행중))

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

<아이디, 비번 찾기 소스코드(memberController.java)>

// 아이디 찾기
	public String doFindLoginId(HttpServletRequest request, HttpServletResponse response) {
		String name = request.getParameter("name");
		String email = request.getParameter("email");

		Member member = memberService.getMemberByNameAndEmail(name, email);

		// 해당 이름과 이메일주소를 가진 회원이 존재하는지 확인
		if (member == null) {
			request.setAttribute("alertMsg", "일치하는 회원이 존재하지 않습니다.");
			request.setAttribute("historyBack", true); // historyBack: 뒤로 돌아가기
			return "common/redirect";
		}

		// 로그인아이디 알림창 보여주고 로그인화면으로 이동
		request.setAttribute("alertMsg", name + "회원님의 아이디는 \"" + member.getLoginId() + "\"입니다.");
		request.setAttribute("replaceUrl", "../member/doLoginForm");
		return "common/redirect";
	}




	// 비밀번호 찾기 폼
	public String doFindLoginPwForm(HttpServletRequest request, HttpServletResponse response) {
		return "usr/member/doFindLoginPwForm";
	}

	// 비밀번호 찾기
	public String doFindLoginPw(HttpServletRequest request, HttpServletResponse response) {
		String loginId = request.getParameter("loginId");
		String email = request.getParameter("email");

		Member member = memberService.getMemberByLoginId(loginId);

		// 해당 loginId가 등록된 id인지 확인
		if (member == null) {
			request.setAttribute("alertMsg", "일치하는 회원이 존재하지 않습니다.");
			request.setAttribute("historyBack", true); // historyBack: 뒤로 돌아가기
			return "common/redirect";
		}

		// 해당 email이 일치하는지 확인
		if (member.getEmail().equals(email) == false) {
			request.setAttribute("alertMsg", "이메일주소가 일치하지 않습니다.");
			request.setAttribute("historyBack", true); // historyBack: 뒤로 돌아가기
			return "common/redirect";
		}

		// 임시 비밀번호 생성 후 회원 email로 발송
		// memberService.sendTempLoginPwToEmail(member);

		// 임시 비밀번호 생성 후 회원 email로 발송(개선)
		/*
		 * //ResultData 객체 도입으로 삭제 Map<String, Object> sendTempLoginPwToEmailRs =
		 * memberService.sendTempLoginPwToEmail(member);
		 * 
		 * String resultCode = (String) sendTempLoginPwToEmailRs.get("resultCode");
		 * String resultMsg = (String) sendTempLoginPwToEmailRs.get("resultMsg");
		 */

		// 임시 비밀번호 생성 후 회원 email로 발송(개선)
		ResultData sendTempLoginPwToEmailRs = memberService.sendTempLoginPwToEmail(member);

		/// 만약 메일 발송 실패인 경우
		// if(resultCode.contains("F")) {
		if (sendTempLoginPwToEmailRs.isFail()) {
			request.setAttribute("alertMsg", sendTempLoginPwToEmailRs.getMsg());
			request.setAttribute("historyBack", true);
			return "common/redirect";
		}

		// 임시패스워드 발급 알림창 보여주고 메인화면으로 이동
		request.setAttribute("alertMsg", sendTempLoginPwToEmailRs.getMsg());
		request.setAttribute("replaceUrl", "../home/main");
		return "common/redirect";
	}

<임시 비번 발급 및 메일 발송(memberService.java)>

public ResultData sendTempLoginPwToEmail(Member actor) {
		// 메일의 제목과 내용 생성
		String siteName = App.getSite();
		String siteLoginUrl = App.getLoginUrl();
		String title = "[" + siteName + "]" + actor.getName() + " 회원님, 임시 패스워드 발급";
		String tempPassword = Util.getTempPassword(6);
		String body = "<h1>임시 패스워드 : " + tempPassword + "</h1>";
		body += "<a href=\"" + siteLoginUrl + "\" target=\"_blank\">로그인하러 가기</a>";

		// 메일 발송(결과를 알 수 없음)
		// emailService.send(actor.getEmail(), title, body);

		// 메일 발송 결과를 int값으로 받음(개선)
		int sendRs = emailService.send(actor.getEmail(), title, body);

		Map<String, Object> rs = new HashMap<>();

		/*  //ResultData객체 도입으로 삭제
		 * if (sendRs == 1) { // 발송 성공인 경우 rs.put("resultCode", "S-1");
		 * rs.put("resultMsg", "회원님의 임시 비밀번호가 \"" + actor.getEmail() + "\"로 발송되었습니다.");
		 * 
		 * // 회원의 패스워드를 방금 생성한 임시 패스워드로 변경 setTempPassword(actor, tempPassword); } else
		 * { // 발송 실패인 경우 rs.put("resultCode", "F-1"); rs.put("resultMsg",
		 * "메일 발송에 실패했습니다.");
		 * 
		 * }
		 * 
		 * 
		 * return rs;
		 */

		
		if(sendRs != 1) {
			return new ResultData("F-1", "메일 발송에 실패했습니다.");
		}
		
		setTempPassword(actor, tempPassword);
		String resultMsg = "회원님의 임시 비밀번호가 \"" + actor.getEmail() + "\"로 발송되었습니다.";
		return new ResultData("S-1", resultMsg, "email", actor.getEmail());
		
	}

	private void setTempPassword(Member actor, String tempPassword) {
		Map<String, Object> modifyArg = new HashMap<>();
		modifyArg.put("id", actor.getId());
		modifyArg.put("loginPw", Util.sha256(tempPassword));

		modify(modifyArg);
	}

	private void modify(Map<String, Object> modifyArg) {
		memberDao.modify(modifyArg);

	}

<임시 비번 발급 및 메일 발송 유틸(Util.java)>

// 임시 패스워드 생성 유틸
	public static String getTempPassword(int length) {
		int index = 0;
		char[] charArr = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };

		StringBuffer sb = new StringBuffer();

		for (int i = 0; i < length; i++) {
			index = (int) (charArr.length * Math.random());
			sb.append(charArr[index]);
		}

		return sb.toString();
	}

	// 임시 패스워드 암호화 유틸
	public static String sha256(String base) {
		try {
			MessageDigest digest = MessageDigest.getInstance("SHA-256");
			byte[] hash = digest.digest(base.getBytes("UTF-8"));
			StringBuffer hexString = new StringBuffer();

			for (int i = 0; i < hash.length; i++) {
				String hex = Integer.toHexString(0xff & hash[i]);
				if (hex.length() == 1)
					hexString.append('0');
				hexString.append(hex);
			}

			return hexString.toString();

		} catch (Exception ex) {
			return "";
		}
	}

<ResultData.java>

package com.sbs.example.jspCommunity.dto;

import java.util.LinkedHashMap;
import java.util.Map;

import lombok.Data;

@Data
// 결과보고서 객체를 HashMap이 아닌 전용객체(ResultData)로 변경
public class ResultData {   //result 관련 값들을 모아 결과값을 계산, 정리해주는 객체
	private String resultCode;
	private String msg;
	private Object body;

	// 조합1: 코드, 메시지
	public ResultData(String resultCode, String msg) {
		this(resultCode, msg, null);
	}

	// 조합2: 코드, 메시지, 내용
	public ResultData(String resultCode, String msg, Object body) {
		this.resultCode = resultCode;
		this.msg = msg;
		this.body = body;
	}

	// 조합3: 코드, 메시지, 내용1키, 내용1값
	public ResultData(String resultCode, String msg, String bodyParam1Key, Object bodyParam1Value) {
		this(resultCode, msg, bodyParam1Key, bodyParam1Value, null, null);
	}

	// 조합4: 코드, 메시지, 내용1키, 내용1값, 내용2키, 내용2값
	public ResultData(String resultCode, String msg, String bodyParam1Key, Object bodyParam1Value, String bodyParam2Key, Object bodyParam2Value) {
		this(resultCode, msg, bodyParam1Key, bodyParam1Value, bodyParam2Key, bodyParam2Value, null, null);
	}

	// 조합5: 코드, 메시지, 내용1키, 내용1값, 내용2키, 내용2값, 내용3키, 내용3값
	public ResultData(String resultCode, String msg, String bodyParam1Key, Object bodyParam1Value, String bodyParam2Key, Object bodyParam2Value, String bodyParam3Key, Object bodyParam3Value) {
		this(resultCode, msg, bodyParam1Key, bodyParam1Value, bodyParam2Key, bodyParam2Value, bodyParam3Key, bodyParam3Value, null, null);
	}

	// 조합6: 코드, 메시지, 내용1키, 내용1값, 내용2키, 내용2값, 내용3키, 내용3값, 내용4키, 내용4값
	public ResultData(String resultCode, String msg, String bodyParam1Key, Object bodyParam1Value, String bodyParam2Key, Object bodyParam2Value, String bodyParam3Key, Object bodyParam3Value, String bodyParam4Key, Object bodyParam4Value) {
		this(resultCode, msg);

		Map<String, Object> body = new LinkedHashMap<>();

		if (bodyParam1Key != null) {
			body.put(bodyParam1Key, bodyParam1Value);
		}

		if (bodyParam2Key != null) {
			body.put(bodyParam2Key, bodyParam2Value);
		}

		if (bodyParam3Key != null) {
			body.put(bodyParam3Key, bodyParam3Value);
		}

		if (bodyParam4Key != null) {
			body.put(bodyParam4Key, bodyParam4Value);
		}

		if (body.isEmpty() == false) {
			this.body = body;
		}
	}

	public boolean isFail() {
		return isSuccess() == false;
	}

	public boolean isSuccess() {
		return resultCode.startsWith("S-");
	}
}