21.01.25 JSPCommunity 프로젝트(아이디,비번 찾기, 비번 해시암호화, 임시비번 메일발송, ResultData 객체 도입, 게시물 총 수, 게시물 검색기능(진행중))
2021. 1. 25. 22:22ㆍJAVA/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-");
}
}
'JAVA > JSP Community 사이트 프로젝트' 카테고리의 다른 글
21.01.27 JSPCommunity 프로젝트(게시물 페이징 추가, 토스트에디터,뷰어 추가) (0) | 2021.01.27 |
---|---|
21.01.26 JSPCommunity 프로젝트(홈 메인페이지 템플릿 디자인) (0) | 2021.01.26 |
21.01.22 JSPCommunity 프로젝트(인터셉터에서 로그인 관련 정보를 req에 추가, 로그인 권 한체크 방식변경, SMTP발송 기능 구현) (0) | 2021.01.22 |
21.01.21 JSPCommunity 프로젝트(ajax활용 아이디 중복체크 기능 추가, 메인화면 템플릿 적용) (0) | 2021.01.21 |
21.01.19 JSPCommunity 프로젝트(중복코드 통합, session도입, 권한 체크 방식 개선 등) (0) | 2021.01.19 |