1. 아이디 찾기, 메일 전송 완료 메시지 뜨기 전까지 spin
memberLogin.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | <table class="table table-bordered p-0"> <tr> <td class="text-center"> <input type="checkbox" name="idSave" checked /> <span class="mr-3"> 아이디 저장 </span> <a href="xxxxjavascript:midSearch()">아이디 찾기</a> <span class="mx-3">|</span> <a href="xxxxjavascript:pwdSearch()">비밀번호 찾기</a> </td> </tr> </table> </form> <div id="searchMid"> <hr> <table class="table table-bordered p-0 text-center"> <tr> <td colspan="2" class="text-center"> <font size="4"> <b>아이디 찾기</b> </font> (가입 시 입력한 이름과 메일 주소를 입력하세요.) </td> </tr> <tr> <th>이름</th> <td> <input type="text" name="nameSearch" id="nameSearch" class="form-control" placeholder="이름을 입력하세요."> </td> </tr> <tr> <th>메일 주소</th> <td> <input type="email" name="emailSearch1" id="emailSearch1" class="form-control" placeholder="이메일을 입력하세요."> </td> </tr> <tr> <td colspan="2" class="text-center"> <input type="button" value="아이디 찾기" xxxxonclick="findMid()" class="form-control btn btn-success"> </td> </tr> </table> </div> <div id="searchPassword"> <hr> <table class="table table-bordered p-0 text-center"> <tr> <td colspan="2" class="text-center"> <font size="4"> <b>비밀번호 찾기</b> </font> (가입 시 입력한 아이디와 메일 주소를 입력하세요.) </td> </tr> <tr> <th>아이디</th> <td> <input type="text" name="midSearch" id="midSearch" class="form-control" placeholder="아이디를 입력하세요."> </td> </tr> <tr> <th>메일 주소</th> <td> <input type="email" name="emailSearch2" id="emailSearch2" class="form-control" placeholder="이메일을 입력하세요."> </td> </tr> <tr> <td colspan="2" class="text-center"> <input type="button" value="새 비밀번호 발급" xxxxonclick="newPassword()" class="form-control btn btn-success"> </td> </tr> </table> </div> <div class="d-flex justify-content-center"> <div class="spinner-border" role="status" id="spinner"></div> </div> | cs |
script
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | <style> #spinner { position: fixed; top: 50%; display: none; z-index: 1; width: 3rem; height: 3rem; } </style> <script> 'use strict'; $(function() { $("#searchPassword").hide(); $("#searchMid").hide(); }); // 아이디 찾기 function midSearch() { $("#searchMid").show(); } // 비밀번호 찾기 function pwdSearch() { $("#searchPassword").show(); } // 아이디 찾기 시 이메일로 아이디 발송 function findMid() { let name = $("#nameSearch").val().trim(); let email = $("#emailSearch1").val().trim(); if (name === "" || email === "") { alert("가입 시 등록한 이름과 메일 주소를 입력하세요."); $("#nameSearch").focus(); return false; } $.ajax({ url : "${ctp}/member/memberFindMid", type : "POST", data : { name : name, email : email }, beforeSend : function() { $("#spinner").css("display", "inline-block"); }, success : function(res) { $("#spinner").css("display", "none"); if (res != "0") { alert("회원님의 아이디가 메일로 발송되었습니다.\n메일 수신함을 확인하세요."); } else { alert("입력하신 정보와 일치하는 회원이 없습니다. 확인 후 다시 시도하세요."); } }, error : function() { $("#spinner").css("display", "none"); alert("전송 오류"); } }); } // 임시 비밀번호 등록 시켜주기 function newPassword() { let mid = $("#midSearch").val().trim(); let email = $("#emailSearch2").val().trim(); if (mid === "" || email === "") { alert("가입 시 등록한 아이디와 메일 주소를 입력하세요."); $("#midSearch").focus(); return false; } $.ajax({ url : "${ctp}/member/memberNewPassword", type : "POST", data : { mid : mid, email : email }, beforeSend : function() { $("#spinner").css("display", "inline-block"); }, success : function(res) { $("#spinner").css("display", "none"); if (res != "0") { alert("새로운 비밀번호가 회원님 메일로 발송되었습니다.\n메일 수신함을 확인하세요."); } else { alert("등록하신 정보가 일치하지 않습니다. 확인 후 다시 시도하세요."); } }, error : function() { $("#spinner").css("display", "none"); alert("전송 오류"); } }); } </script> | cs |
MemberController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | @ResponseBody @RequestMapping(value = "/memberFindMid", method = RequestMethod.POST) public String memberFindMid(String name, String email) throws MessagingException { MemberVO vo = memberService.findMid(name, email); if (vo != null && vo.getEmail().equals(email)) { String mid = vo.getMid(); // 찾은 아이디를 메일로 전송 처리한다. String title = "아이디 찾기로 찾으신 아이디 전달드립니다."; String mailFlag = "아이디 : " + mid; String res = mailSend(email, title, mailFlag); if (res == "1") { return "1"; } } return "0"; } @ResponseBody @RequestMapping(value = "/memberNewPassword", method = RequestMethod.POST) public String memberNewPasswordPost(String mid, String email) throws MessagingException { MemberVO vo = memberService.getMemberIdCheck(mid); if (vo != null && vo.getEmail().equals(email)) { // 정보 확인 후 정보가 맞으면 임시 비밀번호를 발급 받아서 메일로 전송 처리한다. UUID uid = UUID.randomUUID(); String pwd = uid.toString().substring(0, 8); // 새로 발급받은 비밀번호를 암호화 한 후 DB에 저장 memberService.setMemberPasswordUpdate(mid, passwordEncoder.encode(pwd)); // 발급 받은 비밀번호를 메일로 전송 처리한다. String title = "임시 비밀번호를 발급하였습니다."; String mailFlag = "임시 비밀번호 : " + pwd; String res = mailSend(email, title, mailFlag); if (res == "1") { return "1"; } } return "0"; } // 메일 전송하기(아이디 찾기, 비밀번호 찾기) private String mailSend(String toMail, String title, String mailFlag) throws MessagingException { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()) .getRequest(); String content = ""; // 메일 전송을 위한 객체 : MimeMessage(), MimeMessageHelper() MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "utf-8"); // 메일 보관함에 작성한 메세지들의 정보를 모두 저장시킨 후 작업 처리 messageHelper.setTo(toMail); // 받는 사람 메일 주소 messageHelper.setSubject(title); // 메일 제목 messageHelper.setText(content); // 메일 내용 // 메세지 보관함의 내용(content)에 발신자의 필요한 정보를 추가로 담아서 전송 처리한다. content = content.replace("\n", "<br>"); content += "<br><hr><h3>" + mailFlag + "</h3><hr>"; content += "<img src='cid:loginImage' width='500px'>"; content += "<p>방문하기 : <a href='http://49.142.157.251:9090/javaclassJ8/main'>javaclass</a></p>"; content += "<hr>"; messageHelper.setText(content, true); // inline 그림 보내기 // request.getSession().getServletContext().getRealPath("/resources/images/login.jpg"); // 본문에 기재될 그림파일의 경로를 별도로 표시시켜준다. 그런 후 다시 보관함에 저장한다. FileSystemResource inlineImage = new FileSystemResource( request.getSession().getServletContext().getRealPath("/resources/images/login.jpg")); messageHelper.addInline("loginImage", inlineImage); // 메일 전송하기 mailSender.send(message); return "1"; } | cs |
MemberService
1 2 3 4 5 6 7 8 9 10 11 12 13 | package com.spring.javaclassS.service; import com.spring.javaclassS.vo.MemberVO; public interface MemberService { public MemberVO getMemberIdCheck(String mid); public void setMemberPasswordUpdate(String mid, String pwd); public MemberVO findMid(String name, String email); } | cs |
MemberServiceImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package com.spring.javaclassS.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.spring.javaclassS.dao.MemberDAO; import com.spring.javaclassS.vo.MemberVO; @Service public class MemberServiceImpl implements MemberService { @Autowired MemberDAO memberDAO; @Override public MemberVO getMemberIdCheck(String mid) { return memberDAO.getMemberIdCheck(mid); } @Override public void setMemberPasswordUpdate(String mid, String pwd) { memberDAO.setMemberPasswordUpdate(mid, pwd); } @Override public MemberVO findMid(String name, String email) { return memberDAO.findMid(name, email); } } | cs |
MemberDAO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package com.spring.javaclassS.dao; import org.apache.ibatis.annotations.Param; import com.spring.javaclassS.vo.MemberVO; public interface MemberDAO { public MemberVO getMemberIdCheck(@Param("mid") String mid); public void setMemberPasswordUpdate(@Param("mid") String mid, @Param("pwd") String pwd); public MemberVO findMid(@Param("name") String name, @Param("email") String email); } | cs |
memberMapper.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.spring.javaclassS.dao.MemberDAO"> <select id="getMemberIdCheck" resultType="com.spring.javaclassS.vo.MemberVO"> select * from member2 where mid = #{mid} </select> <select id="findMid" resultType="com.spring.javaclassS.vo.MemberVO"> select * from member2 where name = #{name} and email = #{email} </select> <insert id="setMemberPasswordUpdate"> update member2 set pwd = #{pwd} where mid = #{mid} </insert> </mapper> | cs |
2. 주소록
mailForm.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | <th>받는 사람</th> <td> <div class="input-group"> <input type="text" name="toMail" placeholder="받는 사람 메일 주소를 입력하세요." autofocus required class="form-control"> <div class="input-group-append"> <a href="#" class="btn btn-primary" data-toggle="modal" data-target="#addressBook">주소록</a> <!-- <input type="button" value="주소록" xxxxonclick="jusorokCheck()" class="btn btn-primary"> --> </div> </div> </td> <!-- The Modal --> <div class="modal fade" id="addressBook"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content"> <!-- Modal Header --> <div class="modal-header"> <h4 class="modal-title">주소록</h4> <button type="button" class="close" data-dismiss="modal">×</button> </div> <!-- Modal body --> <div class="modal-body"> <table class="table table-hover"> <thead class="table-secondary"> <tr> <th>아이디</th> <th>이름</th> <th>이메일</th> </tr> </thead> <tbody> <c:forEach var="member" items="${memberDetails}"> <tr xxxxonclick="selectEmail('${member.email}')"> <td>${member.mid}</td> <td>${member.name}</td> <td>${member.email}</td> </tr> </c:forEach> </tbody> </table> </div> <!-- Modal footer --> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> </div> </div> </div> </div> | cs |
script
1 2 3 4 5 6 7 8 9 10 11 | 'use strict' $(document).ready(function() { $('#addressBook').on('show.bs.modal', function() { }); }); function selectEmail(email) { $('input[name="toMail"]').val(email); $('#addressBook').modal('hide'); } | cs |
StudyController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | @RequestMapping(value = "/mail/mailForm", method = RequestMethod.GET) public String mailForm(Model model) { List<MemberVO> memberDetails = studyService.getMemberDetails(); model.addAttribute("memberDetails", memberDetails); return "study/mail/mailForm"; } // 메일 전송하기 @RequestMapping(value = "/mail/mailForm", method = RequestMethod.POST) public String mailFormPost(MailVO vo, HttpServletRequest request) throws MessagingException { String toMail = vo.getToMail(); String title = vo.getTitle(); String content = vo.getContent(); // 메일 전송을 위한 객체 : MimeMessage(), MimeMessageHelper() MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "utf-8"); // 메일 보관함에 작성한 메세지들의 정보를 모두 저장시킨 후 작업 처리 messageHelper.setTo(toMail); // 받는 사람 메일 주소 messageHelper.setSubject(title); // 메일 제목 messageHelper.setText(content); // 메일 내용 // 메세지 보관함의 내용(content)에 발신자의 필요한 정보를 추가로 담아서 전송 처리한다. content = content.replace("\n", "<br>"); content += "<br><hr><h3>javaclass에서 보냅니다.</h3><hr>"; content += "<img src='cid:loginImage' width='500px'>"; content += "<p>방문하기 : <a href='http://49.142.157.251:9090/javaclassJ8/main'>javaclass</a></p>"; content += "<hr>"; messageHelper.setText(content, true); // inline 그림 보내기 // request.getSession().getServletContext().getRealPath("/resources/images/login.jpg"); // 본문에 기재될 그림파일의 경로를 별도로 표시시켜준다. 그런 후 다시 보관함에 저장한다. FileSystemResource inlineImage = new FileSystemResource( request.getSession().getServletContext().getRealPath("/resources/images/login.jpg")); messageHelper.addInline("loginImage", inlineImage); // 첨부파일 보내기 FileSystemResource attachmentFile = new FileSystemResource( request.getSession().getServletContext().getRealPath("/resources/images/chicago.jpg")); messageHelper.addAttachment("chicago.jpg", attachmentFile); attachmentFile = new FileSystemResource( request.getSession().getServletContext().getRealPath("/resources/images/sanfran.zip")); messageHelper.addAttachment("sanfran.zip", attachmentFile); // 메일 전송하기 mailSender.send(message); return "redirect:/message/mailSendOk"; } | cs |
StudyService
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package com.spring.javaclassS.service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import com.spring.javaclassS.vo.CrimeVO; import com.spring.javaclassS.vo.MemberVO; import com.spring.javaclassS.vo.UserVO; public interface StudyService { public List<MemberVO> getMemberDetails(); } | cs |
StudyServiceImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package com.spring.javaclassS.service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.spring.javaclassS.dao.StudyDAO; import com.spring.javaclassS.vo.CrimeVO; import com.spring.javaclassS.vo.MemberVO; import com.spring.javaclassS.vo.UserVO; @Service public class StudyServiceImpl implements StudyService { @Autowired StudyDAO studyDAO; @Override public List<MemberVO> getMemberDetails() { return studyDAO.getMemberDetails(); } } | cs |
StudyDAO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package com.spring.javaclassS.dao; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.apache.ibatis.annotations.Param; import com.spring.javaclassS.vo.CrimeVO; import com.spring.javaclassS.vo.MemberVO; import com.spring.javaclassS.vo.UserVO; public interface StudyDAO { public List<MemberVO> getMemberDetails(); } | cs |
studyMapper.xml
1 2 3 4 5 6 7 8 9 | <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.spring.javaclassS.dao.StudyDAO"> <select id="getMemberDetails" resultType="com.spring.javaclassS.vo.MemberVO"> select mid, name, email from member2 </select> </mapper> | cs |
첫댓글 beforeSend를 활용한 spinner사용예제 좋습니다. 잘 활용하시고요.
주소록도 잘 만드셨네요. 수고하셨습니다.