quilt code

[전자정부프레임워크] 게시판 만들기 (3) 본문

weekly/게시판 만들기

[전자정부프레임워크] 게시판 만들기 (3)

김뱅쇼 2023. 12. 26. 17:58

1. 로그인

[화면]


: 로그인 화면




: 로그인 후 화면 (상단에 회원 이름 출력)


: 아이디와 비밀번호가 일치하지 않았을 경우

[xml]

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
<mapper namespace="egovframework.example.member.service.MemberMapper">
 
    <select id="loginCheck" resultType="String">
        SELECT memNm 
        FROM MEMBER
        WHERE memId = #{memId} AND memPw = #{memPw}
    </select>
    
    <select id="viewMember" resultType="egovframework.example.member.vo.MemberVo">
        SELECT 
            memNo,
            memId,
            memPw,
            memNm
        FROM MEMBER
        WHERE memId = #{memId} AND memPw = #{memPw}
    
    </select>
    
    <select id="idCheck" parameterType="String" resultType="int">
        SELECT 
            count(memId) 
        FROM MEMBER 
        WHERE mem_id = #{memId}
    </select>
cs


[controller]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 로그인
    @RequestMapping(value = "/loginCheck.do")
    public ModelAndView loginCheck(@ModelAttribute MemberVo vo, HttpSession session) {
//        System.out.println("로그인!!!!!!!!!!!!!!!!");
        boolean result = memberService.loginCheck(vo, session);
        ModelAndView mav = new ModelAndView();
//        System.out.println("result : " + result);
 
        if (result == true) { // 로그인 성공
            // main.jsp로 이동
            mav.setViewName("member/main");
            mav.addObject("msg""success");
 
        } else { // 로그인 실패
            // login.jsp로 이동
            mav.setViewName("member/login");
            mav.addObject("msg""failure");
        }
        return mav;
 
    }
cs
[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
    <%@ include file="/WEB-INF/jsp/member/menu.jsp"%>
    <form name="form1" method="post" action="/sessionTest.do">
    <div class="container" align="center">
        <table border="0" width="400px">
            <tr>
                <td>아이디</td>
                <td><input class="form-control form-control-sm" style="width:200px;" name="memId" id="memId"></td>
            </tr>
            <tr>
                <td>비밀번호</td>
                <td><input class="form-control form-control-sm" style="width:200px;" type="password" name="memPw" id="memPw"></td>
            </tr>
            <tr>
                <td colspan="2" align="center">
<%--                     <button class="btn btn-primary me-1 mb-1" type="button" >로그인</button> <c:if --%>
<%--                         test="${msg == 'failure'}"> --%>
                    <button class="btn btn-primary me-1 mb-1" type="button" id="btnLogin">로그인</button> 
                    <c:if test="${msg == 'failure'}"> 
                        <div style="color: red">아이디 또는 비밀번호가 일치하지 않습니다.</div>
                    </c:if> <c:if test="${msg == 'logout'}">
                        <div style="color: red">로그아웃되었습니다.</div>
                    </c:if>
                </td>
            </tr>
            <tr>
                <td colspan="2" align="center">
                    <button class="btn btn-outline-primary me-1 mb-1" type="button" id="btnFindPw" onClick="location.href='./findPwPage.do'">비밀번호를 잊어버리셨나요?</button> 
                </td>
            </tr>
        </table>
    </div>
    </form>
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$(document).ready(function() {
    $("#btnLogin").click(function() {
        // 태크.val() : 태그에 입력된 값
        // 태크.val("값") : 태그의 값을 변경 
        var memId = $("#memId").val();
        var memPw = $("#memPw").val();
        if (memId == "") {
            alert("아이디를 입력하세요.");
            $("#memId").focus(); // 입력포커스 이동
            return// 함수 종료
        }
        if (memPw == "") {
            alert("비밀번호를 입력하세요.");
            $("#memPw").focus();
            return;
        }
        // 폼 내부의 데이터를 전송할 주소
        document.form1.action = "${path}/member/loginCheck.do"
        // 제출
        document.form1.submit();
    });
});
    
cs

 

 

2. 로그아웃

[화면]

[controller]

1
2
3
4
5
6
7
8
9
    // 로그아웃
    @RequestMapping(value = "/logout.do")
    public ModelAndView logout(HttpSession session) {
        memberService.logout(session);
        ModelAndView mav = new ModelAndView();
        mav.setViewName("member/logout");
        mav.addObject("msg""logout");
        return mav;
    }
cs

 

 

3. 회원가입

[화면]


: 회원가입 화면


: 아이디 중복 확인(해당되는 아이디가 존재하는 경우)



: 아이디 중복 확인(해당되는 아이디가 존재하지 않는 경우)


[controller]

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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package egovframework.example.member.controller;
 
import java.util.Random;
 
import javax.inject.Inject;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import org.apache.log4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
 
import egovframework.example.member.service.MemberMapper;
import egovframework.example.member.service.MemberService;
import egovframework.example.member.service.impl.FindPasswordService;
import egovframework.example.member.service.impl.MailSendService;
import egovframework.example.member.vo.MemberVo;
 
@Controller
@RequestMapping("/member/*")
public class MemberController {
 
    @Inject
    MemberService memberService;
 
    @Autowired
    private MailSendService mailService;
 
    @Autowired
    private FindPasswordService findPassword;
 
    // 로그인 화면
    @RequestMapping(value = "/login.do")
    public String login() {
        return "member/login"// login.jsp
    }
 
    // 로그인
    @RequestMapping(value = "/loginCheck.do")
    public ModelAndView loginCheck(@ModelAttribute MemberVo vo, HttpSession session) {
//        System.out.println("로그인!!!!!!!!!!!!!!!!");
        boolean result = memberService.loginCheck(vo, session);
        ModelAndView mav = new ModelAndView();
//        System.out.println("result : " + result);
 
        if (result == true) { // 로그인 성공
            // main.jsp로 이동
            mav.setViewName("member/main");
            mav.addObject("msg""success");
 
        } else { // 로그인 실패
            // login.jsp로 이동
            mav.setViewName("member/login");
            mav.addObject("msg""failure");
        }
        return mav;
 
    }
 
    // 로그아웃
    @RequestMapping(value = "/logout.do")
    public ModelAndView logout(HttpSession session) {
        memberService.logout(session);
        ModelAndView mav = new ModelAndView();
        mav.setViewName("member/logout");
        mav.addObject("msg""logout");
        return mav;
    }
 
    // 회원가입 화면으로 가기
    @RequestMapping(value = "/joinForm.do")
    public String joinForm() {
 
//        System.out.println("============회원가입 페이지 왔당============");
        return "member/joinForm";
    }
 
    // 회원가입
    @RequestMapping(value = "/join.do", method = RequestMethod.POST)
    public String join(MemberVo memberVo) throws Exception {
//        System.out.println("============회원가입 왔당============");
//        System.out.println(memberVo.toString());
//        System.out.println(memberVo.getMemId());
//        System.out.println(memberVo.getMemNm());
 
        memberService.join(memberVo);
        return "redirect:/member/login.do";
 
    }
 
    // 아이디 중복 검사
    @RequestMapping(value = "/memIdCheck.do", method = RequestMethod.POST)
    @ResponseBody
    public String memIdCheck(String memId) throws Exception {
        System.out.println("==========idCheck()==========");
 
        int result = memberService.memIdCheck(memId);
        System.out.println("=============아이디result: " + result);
 
        if (result != 0) {
            return "fail"// 중복 아이디 o
        } else {
            return "success"// 중복 아이디 x
        }
    }
 
    // 이메일 중복 검사
    @RequestMapping(value = "/memMailCheck.do", method = RequestMethod.POST)
    @ResponseBody
    public String memMailCheck(String memMail) throws Exception {
        System.out.println("==========mailCheck()==========");
 
        int result = memberService.memMailCheck(memMail);
        System.out.println("============이메일result: " + result);
 
        if (result != 0) {
            return "fail"// 중복 이메일 o
        } else {
            return "success"// 중복 이메일 x
        }
    }
 
    // 인증번호 이메일 전송
    @GetMapping("/mailCheck.do")
    @ResponseBody
    public String mailCheck(String email) {
 
//        System.out.println("=========이메일 인증 요청이 들어옴!");
//        System.out.println("=========이메일 주소 : " + email);
 
        return mailService.joinEmail(email);
    }
 
    // 비밀번호 찾기 화면으로 이동
    @RequestMapping(value = "/findPwPage.do")
    public String findPwPage() {
//        System.out.println("==========비밀번호 찾기 화면으로 이동==========");
        return "member/findPwPage";
    }
 
    // 임시 비밀번호 이메일 전송
    @GetMapping("/pwCheck.do")
    @ResponseBody
    public String pwCheck(String email) {
 
//        System.out.println("=========임시 비밀번호 이메일 인증 요청이 들어옴!");
//        System.out.println("=========이메일 주소 : " + email);
 
        return findPassword.findPw(email);
    }
 
}
 
cs
[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
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=UTF-8">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/jquery-3.4.1.js"></script>
<title>회원 가입</title>
</head>
<body>
    <div>
        <h1 align="center">회원가입</h1>
            <div class="container" >
                <form name="frm" method="post" action="/member/join.do">
                    <div class="form-group" id="divId">
                        <label for="inputId" class="col-lg-2 control-label">아이디</label>
                        <div class="col-lg-5">
                            <input type="text" class="form-control me-1 mb-1" id="memId" name="memId" data-rule-required="true" placeholder="20자이내의 알파벳, 숫자만 입력 가능합니다." maxlength="20">
                        </div>
                         <span class="inputIdYes" style="color:blue; display:none;" >사용 가능한 아이디입니다.</span>
                         <span class="inputIdNo" style="color:red; display:none;" >이미 존재하는 아이디입니다.</span>
                    </div>
                    <div class="form-group" id="divPassword">
                        <label for="inputPassword" class="col-lg-2 control-label">비밀번호</label>
                        <div class="col-lg-10">
                            <input type="password" class="form-control" id="memPw" name="memPw" data-rule-required="true" placeholder="패스워드" maxlength="30">
                        </div>
                    </div>
                    <!-- 
                    <div class="form-group" id="divPasswordCheck">
                        <label for="inputPasswordCheck" class="col-lg-2 control-label">패스워드 확인</label>
                        <div class="col-lg-10">
                            <input type="password" class="form-control" id="passwordCheck" data-rule-required="true" placeholder="패스워드 확인" maxlength="30">
                        </div>
                    </div>
                     -->
                    <div class="form-group" id="divName">
                        <label for="inputName" class="col-lg-2 control-label">이름</label>
                        <div class="col-lg-10">
                            <input type="text" class="form-control onlyHangul" id="memNm" name="memNm" data-rule-required="true" placeholder="한글만 입력 가능합니다." maxlength="15">
                        </div>
                    </div>
                    <div class="form-group" id="divEmail">
                        <label for="inputEmail" class="col-lg-2 control-label">이메일</label>
                        <div class="col-lg-10">
                            <input type="email" class="form-control" id="memMail" name="memMail" data-rule-required="true" placeholder="이메일 주소를 입력해주세요." maxlength="40">
                        </div>
                        <span class="inputEmailYes" style="color:blue; display:none;" >사용 가능한 이메일 주소입니다.</span>
                        <span class="inputEmailNo" style="color:red; display:none;" >이미 존재하는 이메일 주소입니다.</span>
                    </div>
                    <div class="form-group" id="divEmailCheckBox">
                        <div class="col-lg-10 mailCheckBox">
                            <input type="text" class="form-control" placeholder="인증번호 6자리를 입력해주세요." id="mailCheck" name="mailCheck" maxlength="6" />
                        </div>
                        <div class="divMailCheckBtn">
                            <button type="button" class="btn btn-secondary me-1 mb-1" id="mailCheckBtn" name="mailCheckBtn">인증번호 전송</button>
                        </div>
                        <span id="mail-check-warn"></span>
                    </div>
                    <div class="form-group">
                        <div class="col-lg-offset-2 col-lg-10">
                            <button type="submit" onclick="joinBtn()" class="btn btn-primary">회원가입</button>
                        </div>
                    </div>
                </form>
            </div>
</body>
</html>
 
<script type="text/javascript">
 
 
//이메일 인증
$("#mailCheckBtn").click(function() {
        const email = $("#memMail").val(); // 이메일 주소값 가져옴
//         console.log("이메일 : " + email); // 이메일 오는지 확인
        
        const checkInput = $(".mailCheck"// 인증번호 입력하는곳 
    
        $.ajax({
//             console.log("얍!!!!!!");
            type : "get",
            url : "/member/mailCheck.do"
            data: { email: email }, 
//             url : '<c:url value ="/member/mailCheck.do?email="/>'+email, // GET방식이라 Url 뒤에 email을 뭍힐수있다.
            success : function (data) {
//                 console.log("data : " +  data);
                checkInput.attr("disabled",false);
                code = data;
                alert("인증번호가 전송되었습니다.");
            }            
        }); // end ajax
    }); // end send eamil
    
    
    // 인증번호 비교 
    // blur -> focus가 벗어나는 경우 발생
    $("#mailCheck").blur(function () {
        const inputCode = $(this).val();
        const $resultMsg = $("#mail-check-warn");
        
        if(inputCode == code){
            $resultMsg.html("인증번호가 일치합니다.");
            $resultMsg.css("color","blue");
            $("#mailCheckBtn").attr("disabled",true);
            $("#memMail").attr("readonly",true);
        } else {
            $resultMsg.html("인증번호가 불일치 합니다. 다시 확인해주세요!");
            $resultMsg.css("color","red");
        }
    });
    
    
 
function joinBtn(){
    console.log("버튼 눌렸당");
    
    //정규식 형식
    var regExpId = /^(?=.*\d)(?=.*[a-zA-Z])[0-9a-zA-Z]{6,20}$///영문과 숫자 조합의 8-20자, 특수문자(!@#$%^&*)도 사용//         /^[a-zA-z0-9!@#$%^&*()?_~]{6-20}$/
    var regExpPwd = /^(?=.*\d)(?=.*[a-zA-Z])[0-9a-zA-Z!@#$%^&*]{8,20}$/;
    var regExpName = /[가-힝]{2,5}$///한글만 가능
//     var regExpMail = /^\d{3}-\d{4}-\d{4}$/;
    
    //폼 입력값 가져오기
    var frm = document.getElementById("frm");
    
    var memId = frm.memId.value;
    var memPw = frm.memPw.value;
    var memNm = frm.memNm.value;
    var memMail = frm.memMail.value;
    
    console.log("frm",frm);
    console.log("memId",memId);
    console.log("memNm",memNm);
    console.log("memMail",memMail);
    
    
    if(memId == "" || memId == null){
        alert("아이디를 입력해주세요!");
        $("#memId").focus();
        return;
    }
    
//     if(!regExpId.test(memId)){
//         alert("아이디는 영문과 숫자 조합의 6-20자로 입력하세요 ");
//         $("#memId").select();
//         return;
//     }
    
    if(memPw == "" || memPw == null){
        alert("비밀번호를 입력해주세요!");
        $("#memPw").focus();
        return;
    }
    
//     if(!regExpPwd.test(memPw)){
//         alert("비밀번호는 영문과 숫자, 특수문자(!@#$%^&*) 조합의 8-20자로 입력하세요 ");
//         $("#memPw").select();
//         return;
//     }
    
    if(memNm == "" || memNm == null){
        alert("이름을 입력해주세요!");
        $("#memNm").focus();
        return;
    }
    
//     if(!regExpName.test(memNm)){
//         alert("이름은 한글만 가능합니다. 2-5자로 입력하세요 ");
//         $("#memNm").select();
//         return;
//     }
    
    if(memMail == "" || memMail == null){
        alert("메일주소를 입력해주세요!");
        $("#memMail").focus();
        return;
    }
    
//     if(!regExpPhone.test(memMail)){
//         alert("형식을 지켜주세요 ");
//         $("#memMail").select();
//         return;
//     }
    
    frm.submit();
    alert("회원가입 성공! 로그인 화면으로 이동합니다.");
}
 
 
 
//아이디 중복 검사
$("#memId").on("propertychange change keyup paste input"function(){
//     alert("keyup 테스트");
//     console.log("keyup 테스트");    
 
    var memId = $("#memId").val();
    var data = {memId : memId}
    
    $.ajax({
            type     :    "post",
            url     :    "/member/memIdCheck.do",
            data    : data,
            success    : function(result){
                //console.log("얍!!" + result);
                if(result != 'fail'){
                    $('.inputIdYes').css("display","inline-block");
                    $('.inputIdNo').css("display""none");                
                } else {
                    $('.inputIdNo').css("display","inline-block");
                    $('.inputIdYes').css("display""none");                
                }
                
            } //success 끝
        
    }); //ajax 끝
 
}); // function 끝
 
 
//이메일 중복 검사
$("#memMail").on("propertychange change keyup paste input"function(){
//     alert("keyup 테스트");
//     console.log("keyup 테스트");    
 
    var memMail = $("#memMail").val();
    var data = {memMail : memMail}
    
    $.ajax({
            type     :    "post",
            url     :    "/member/memMailCheck.do",
            data    : data,
            success    : function(result){
                console.log("얍!!" + result);
                if(result != 'fail'){
                    $('.inputEmailYes').css("display","inline-block");
                    $('.inputEmailNo').css("display""none");                
                } else {
                    $('.inputEmailNo').css("display","inline-block");
                    $('.inputEmailNo').css("display""none");                
                }
                
            } //success 끝
        
    }); //ajax 끝
 
}); // function 끝
 
 
 
 
 
 
 
 
</script>
</body>
</html>
 
 
 
 
 
 
cs



아이디, 이메일 중복 검사

 

 

4. 회원가입 - 이메일 인증

[화면]



: 인증번호 전송



: 인증번호 수신 화면



: 인증번호 일치



: 인증번호 불일치


[serviceImpl - MailSendService]


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
102
103
104
105
106
package egovframework.example.member.service.impl;
 
import java.util.Properties;
import java.util.Random;
 
import javax.inject.Inject;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
 
@Service("mailSendService")
public class MailSendService {
    
    //어노테이션이 안돼서 선언으로 할당해줌!
//    @Autowired
//    private JavaMailSenderImpl mailSender;
//    private int authNumber;
    
    // 난수 발생
    public int makeRandomNumber() {
        // 난수의 범위 111111 ~ 999999 (6자리 난수)
        Random r = new Random();
        int checkNum = r.nextInt(888888+ 111111;
        System.out.println("인증번호 : " + checkNum);
 
        return checkNum;
        
    }
 
    // 이메일 양식
    public String joinEmail(String email) {
        
        //선언1(랜덤번호 발생)
        int authNumber = makeRandomNumber();
        
        String setFrom = "ao22hi@gmail.com"// email-config에 설정한 자신의 이메일 주소를 입력
        String toMail = email;
        String title = "회원 가입 인증 이메일입니다."// 이메일 제목
        String content = "반갑습니당!" + // html 형식으로 작성 !
                "<br><br>" + "인증 번호는 " + authNumber + "입니다." + "<br>" + "해당 인증번호를 인증번호 확인란에 기입하여 주세요."// 이메일 내용 삽입
        mailSend(setFrom, toMail, title, content);
        return Integer.toString(authNumber);
    }
 
    // 이메일 전송 메소드
    public void mailSend(String setFrom, String toMail, String title, String content) {
        
        //dispatcher-servlet에 있는 properties값 가져오기
        Properties props = System.getProperties();
        
        //설정된 name값이랑 동일하게 해야함(props.put("name","value");)
        props.put("host""smtp.gmail.com"); 
        props.put("port""587"); 
        props.put("username""ao22hi@gmail.com"); 
        props.put("password""nibaxscnnubnilif"); 
//        props.put("javaMailProperties","javaMailProperties"); 
        
        props.put("mail.transport.protocol""smtp");
        props.put("mail.smtp.auth""true");
        props.put("mail.smtp.socketFactory.class""javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.starttls.enable""true");
        props.put("mail.debug""true");
        props.put("mail.smtp.ssl.trust""smtp.gmail.com");
        props.put("mail.smtp.ssl.protocols""TLSv1.2");
        
        //properties 값을 session에 담아옴
        Session session = Session.getDefaultInstance(props);
        
        //선언2(JavaMailSenderImpl)
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        
        //javaMailSender
        mailSender.setHost("smtp.gmail.com"); 
        mailSender.setPort(587); 
        mailSender.setUsername("ao22hi@gmail.com"); 
        mailSender.setPassword("nibaxscnnubnilif"); 
        mailSender.setJavaMailProperties(props);
        
        //MimeMessage - createMimeMessage
        MimeMessage message = mailSender.createMimeMessage();
        
        // true 매개값을 전달하면 multipart 형식의 메세지 전달이 가능.문자 인코딩 설정도 가능하다.
        try {
            
            MimeMessageHelper helper = new MimeMessageHelper(message, true"utf-8");
            helper.setFrom(setFrom);
            helper.setTo(toMail);
            helper.setSubject(title);
            // true 전달 > html 형식으로 전송 , 작성하지 않으면 단순 텍스트로 전달.
            helper.setText(content, true);
            mailSender.send(message);
            
        } catch (MessagingException e) {
            e.printStackTrace();
            
        }
    }
 
}
 
cs



[controller]


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
// 인증번호 이메일 전송
    @GetMapping("/mailCheck.do")
    @ResponseBody
    public String mailCheck(String email) {
 
//        System.out.println("=========이메일 인증 요청이 들어옴!");
//        System.out.println("=========이메일 주소 : " + email);
 
        return mailService.joinEmail(email);
    }
 
    // 비밀번호 찾기 화면으로 이동
    @RequestMapping(value = "/findPwPage.do")
    public String findPwPage() {
//        System.out.println("==========비밀번호 찾기 화면으로 이동==========");
        return "member/findPwPage";
    }
 
    // 임시 비밀번호 이메일 전송
    @GetMapping("/pwCheck.do")
    @ResponseBody
    public String pwCheck(String email) {
 
//        System.out.println("=========임시 비밀번호 이메일 인증 요청이 들어옴!");
//        System.out.println("=========이메일 주소 : " + email);
 
        return findPassword.findPw(email);
    }
cs
참조 블로그) https://devofroad.tistory.com/43

 

 

5. 로그인 - 비밀번호 찾기

[화면]


: 비밀번호 찾기 화면


: 임시 비밀번호 전송 화면



: 임시 비밀번호 전송 메일



: 랜덤 생성된 임시 비밀번호로 업데이트가 된 모습

[xml]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <!-- 비밀번호 찾기1 : 아이디 이메일로 회원 확인 -->
    <select id="findPw" resultType="int">
    
        SELECT    COUNT(*)
        FROM    MEMBER
        WHERE    memMail = #{memMail}
    
    </select>
    
    <!-- 비밀번호 찾기2 : 새로운 비밀번호 저장 -->
    <update id="savePw" parameterType="egovframework.example.member.vo.MemberVo">
        UPDATE     MEMBER
        SET        memPw     = #{memPw}
        WHERE    memMail = #{memMail} 
     </update>
cs



[serviceImpl - FindPassWordService]

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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
package egovframework.example.member.service.impl;
 
import java.util.Properties;
import java.util.Random;
 
import javax.inject.Inject;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
 
import egovframework.example.member.dao.MemberDao;
import egovframework.example.member.dao.impl.MemberDaoImpl;
import egovframework.example.member.vo.MemberVo;
 
 
@Service
public class FindPasswordService {
    
    @Autowired
    private MemberDao memberDao;
 
    // 임시 비밀번호 생성
    public String makeRandomNumber() {
        char[] charSet = 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' };
 
        String tempNum = "";
 
        // 문자 배열 길이의 값을 랜덤으로 10개를 뽑아 구문을 작성함
        int idx = 0;
        for (int i = 0; i < 10; i++) {
            idx = (int) (charSet.length * Math.random());
            tempNum += charSet[idx];
        }
//        System.out.println("##########################################");
//        System.out.println("================임시 비밀번호 : " + tempNum);
 
        return tempNum;
 
    }
 
 
    // 이메일 양식
    public String findPw(String email) {
 
        // 선언1(랜덤번호 발생)
        String tempPassword = makeRandomNumber();
//        System.out.println("/////////////////////////////////////////");
//        System.out.println("========tempPassword: " + tempPassword);
 
        String setFrom = "ao22hi@gmail.com"// email-config에 설정한 자신의 이메일 주소를 입력
        String toMail = email;
        String title = "임시 비밀번호 발급 이메일입니다.";     // 이메일 제목
        String content = "비밀번호 까먹지 마세요!" +         // html 형식으로 작성
                "<br><br>" + "임시 비밀번호는 " + tempPassword + "입니다."// 이메일 내용 삽입
        
        //임시 비밀번호 DB update
        MemberVo vo = new MemberVo();                //MemberVo를 불러와서
        vo.setMemMail(email);                        //memMail
        vo.setMemPw(tempPassword);                    //memPw에 tempPassword를 넣어줌
        memberDao.savePw(vo);                        //memberDao에 가서 savePw 쿼리를 불러옴
        
        mailSend(setFrom, toMail, title, content);    //mailSend 메소드로 gogo
        
        return tempPassword;
    }
    
    /*
    // 임시 비밀번호로 변경
    public void updatePassword(String str, String userEmail) {
        System.out.println("///////////////////여기까지 오나요(임시 비밀번호 변경)/////////////////////");
        
        String memberPassword = str;
        Long memberId = mr.findByMemberEmail(userEmail).getId();
        mmr.updatePassword(memberId,memberPassword);
        
        
        MemberDaoImpl memberDao = new MemberDaoImpl();
        
        memberDao.savePw();
        if (member != null) {
            
            // 사용자 정보가 있으면 비밀번호 업데이트
            member.setPassword(newPassword);
            memberDao.updateMemberPassword(member);
        } else {
            
            // 사용자 정보가 없을 경우 예외 처리 또는 적절한 로직 추가
            System.out.println("해당 이메일을 가진 사용자를 찾을 수 없습니다.");
        }
    }    
    */
 
    // 이메일 전송 메소드
    public void mailSend(String setFrom, String toMail, String title, String content) {
        
        /*
        //임시 비밀번호로 update
        String tempPw2 = makeRandomNumber();
        MemberDaoImpl memberDao = new MemberDaoImpl();
        memberDao.savePw(vo);
        System.out.println("/////////////////////////////////////");
        System.out.println("memberVo: " + vo);
        System.out.println("////////////임시 비밀번호로 변경///////////");
        */
 
        // dispatcher-servlet에 있는 properties값 가져오기
        Properties props = System.getProperties();
 
        // 설정된 name값이랑 동일하게 해야함(props.put("name","value");)
        props.put("host""smtp.gmail.com");
        props.put("port""587");
        props.put("username""ao22hi@gmail.com");
        props.put("password""nibaxscnnubnilif");
 
        props.put("mail.transport.protocol""smtp");
        props.put("mail.smtp.auth""true"); 
        props.put("mail.smtp.socketFactory.class""javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.starttls.enable""true");
        props.put("mail.debug""true");
        props.put("mail.smtp.ssl.trust""smtp.gmail.com");
        props.put("mail.smtp.ssl.protocols""TLSv1.2");
 
        // properties 값을 session에 담아옴
        Session session = Session.getDefaultInstance(props);
 
        // 선언2(JavaMailSenderImpl)
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
 
        // javaMailSender
        mailSender.setHost("smtp.gmail.com");
        mailSender.setPort(587);
        mailSender.setUsername("ao22hi@gmail.com");
        mailSender.setPassword("nibaxscnnubnilif");
        mailSender.setJavaMailProperties(props);
 
        MimeMessage message = mailSender.createMimeMessage();
 
        try {
 
            MimeMessageHelper helper = new MimeMessageHelper(message, true"utf-8");
            helper.setFrom(setFrom);
            helper.setTo(toMail);
            helper.setSubject(title);
            helper.setText(content, true);
            mailSender.send(message);
 
        } catch (MessagingException e) {
            e.printStackTrace();
 
        }
    }
    
}
 
 
 
 
 
 
 
 
cs



[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
72
73
74
75
76
77
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=UTF-8">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/jquery-3.4.1.js"></script>
<title>비밀번호 찾기</title>
 
</head>
<body>
 
<%@ include file="/WEB-INF/jsp/member/menu.jsp"%>
<form name="form1" method="post" action="/sessionTest.do">
    <div class="container" id="tempPw" align="center">
        <label for="inputEmail" class="control-label">회원가입 시 작성했던 이메일 주소를 입력하세요.</label>
        <table border="0" width="400px">
            <tr>
                <td align="center">
                    <input type="email" class="form-control" id="memMail" name="memMail" data-rule-required="true" maxlength="40">
                </td>
            </tr>
            <tr>
                <td align="center">
                    <button type="button" class="btn btn-primary me-1 mb-1" id="tempPwBtn" name="tempPwBtn">임시 비밀번호 발송</button>
                </td>
            </tr>
        </table>
    </div>
</form>
</body>
 
<script>
 
 
//임시 비밀번호 전송
$("#tempPwBtn").click(function() {
    const email = $("#memMail").val(); // 이메일 주소값 가져옴
//        console.log("이메일 : " + email); // 이메일 오는지 확인
 
    $.ajax({
//            console.log("얍!!!!!!");
        type : "get",
        url : "/member/pwCheck.do"
        data: { email: email }, 
        
        success : function (data) {
//                console.log("data : " +  data);
            code = data;
            alert("임시 비밀번호가 전송되었습니다. 로그인 페이지로 이동합니다.");
            let url = `/member/login.do`;
//             console.log(url);
 
            //임시 비밀번호 전송 후 로그인 페이지로 이동
            location.replace(url);
        }            
    }); // ajax끝 
    
    //임시 비밀번호 발송 한번만 실행
    $(this).attr("disabled"true);
    
}); // 이메일 보내기 끝
 
 
    
    
    
</script>
</html>
 
 
 
 
 
 
cs