Springemail一時パスワード発行


最終プロジェクトを行う過程で、Eメール連動を実施しました.
いろいろなコードがありますがspringの特性で
設定が複雑すぎて想像以上に時間がかかります.
まず、springに基づいてxmlではなくjavaクラスとして実装します.
NAVER、
新しいgmailアカウントを作成して使用するには、gmailに基づいて作成します.

poem

        <dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-email</artifactId>
			<version>1.5</version>
		</dependency>
->詩歌の設定も多様で、会員入学試験に必要な詩歌の設定も異なる.
まず、パスワードを一時的に発行する追加dependencyは1つの設定しかありません.
(必ずmavenを更新してください)

MailUtil

public class MailUtil {
	@Autowired UserService service;
	
	public void sendEmail(UserVo vo) throws Exception{
		
		//Mail Server 설정
		String charSet="utf-8";
		String hostSMTP="smtp.gmail.com";
		String hostSMTPid=""; //관리자 이메일 아이디
		String hostSMTPpw=""; //관리자 이메일 비밀번호
		
		//보내는 사람 
		String fromEmail=""; //보내는 사람 이메일 
		String fromName=""; //보내는 사람 이름
		
		String subject=""; //메일 제목
		String msg="";
		
		msg +="<div align='lift'";
		msg +="<h3>";
		msg +=vo.getUi_id() + "님의 임시 비밀번호입니다. <br>로그인 후 비밀번호를 변경해 주세요</h3>";
		msg +="<p>임시 비밀번호:";
		msg +=vo.getUi_pwd() + "</p></div>";
		
		//email전송
		String mailRecipient=vo.getUi_email();//받는 사람 이메일 주소
		try {
			//객체 선언
			HtmlEmail mail = new HtmlEmail();
			mail.setDebug(true);
			mail.setCharset(charSet);
			mail.setSSLOnConnect(true);
			mail.setHostName(hostSMTP);
			mail.setSmtpPort(587); 
			mail.setAuthentication(hostSMTPid, hostSMTPpw);
			mail.setStartTLSEnabled(true);
			mail.addTo(mailRecipient,charSet);
			mail.setFrom(fromEmail, fromName, charSet);
			mail.setSubject(subject);
			mail.setHtmlMsg(msg);
			mail.send();
			
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	public void findPw(HttpServletResponse response,UserVo vo) {
		response.setContentType("text/html;charset=utf-8");
		
	}

}
->メールを送信するクラスプリファレンスやNAVERや次、Googleなどでどのようにメールを送信するかについての設定ですが、ここにメールを送信する管理者メールアドレスやパスワード設定部分もありますので、羽連動などでプロジェクトを行う場合は注意しましょう.
Eメールアドレスは直接実行できますが、この項目では直接入力できます.

UserServiceController

@RestController
public class UserMailController {
@Autowired private UserService service;
	

	@GetMapping(value = "/finduserpwd",produces = {MediaType.APPLICATION_JSON_VALUE})
	public @ResponseBody String findPw(UserVo vo) throws Exception {
		BCryptPasswordEncoder encoder= new BCryptPasswordEncoder();
		String result=null;
		
		//회원정보 불러오기
		UserVo vo1 = service.searchPwd(vo);
		System.out.println(vo1);
		
		//가입된 이메일이 존재한다면 이메일 전송
		if(vo1!=null) {
			
			//임시 비밀번호 생성(UUID이용)
			String tempPw=UUID.randomUUID().toString().replace("-", "");//-를 제거
			tempPw = tempPw.substring(0,10);//tempPw를 앞에서부터 10자리 잘라줌
			
			vo1.setUi_pwd(tempPw);//임시 비밀번호 담기
	
			MailUtil mail=new MailUtil(); //메일 전송하기
			mail.sendEmail(vo1);
			
			service.updatePwd(vo1);
			
			String securePw = encoder.encode(vo1.getUi_pwd());//회원 비밀번호를 암호화하면 vo객체에 다시 저장
			vo1.setUi_pwd(securePw);
				
			result="true";
			

		}else {
			result="false";
		}
		return result;
	}

}
->コントロールとサービスの部分をdaoではなくmapperとmapperinterfaceを使用して混同します.mailutilを作成してservice=controllerとして作成

この部分でもエラーが発生しました.参考にしたブログでは、送信された一時パスワードを暗号化し、保存して更新するように要求されていました.そうすれば
更新したパスワードでログインできないエラーが発生しました.
1つの実行順序も完全に逆転し、エラーが発生することに注意してください.

Mapper

//아이디와 이메일이 DB에 존재하는지 먼저 검사
<select id="searchPwd" parameterType="com.jhta.project.vo.user.UserVo" resultType="com.jhta.project.vo.user.UserVo">
		select * from user_information where ui_id=#{ui_id} and ui_email=#{ui_email}
	</select>
    //임시비밀번호 발급을 위한 업데이트
	<update id="updatePwd" parameterType="com.jhta.project.vo.user.UserVo">
		update user_information  set ui_pwd=#{ui_pwd} where ui_id=#{ui_id} and ui_email=#{ui_email}
	</update>

FindPwd.jsp

<script type="text/javascript">
	$(function(){
		$("#btn").click(function(){
			let ui_id=$("input[name='ui_id']").val();
			let ui_email=$("input[name='ui_email']").val();
			$.ajax({
				url:"/project/finduserpwd",
				dataType:'json',
				data:{"ui_id":ui_id,"ui_email":ui_email},
				success:function(data){
					if(data==true){
						alert("임시 비밀번호가 발급되었습니다.메일함을 확인해 주세요");
						console.log(data);
					}else{
						alert("아이디 또는 이메일을 정확하게 입력해 주세요");
						console.log(data);
				}
		   	}
		});
	});
});
</script>
</head>
<body>
<form action="${cp}/finduserpwd" method="post">
	<h2>임시 비밀번호 발급</h2>
	아이디<br>
	<input type="text" name="ui_id"><br>
	이메일<br>
	<input type="email" name="ui_email"><br>
	<input type="button" value="임시비밀번호 발급" id="btn"><br> 
	<a href="${cp }/loginuser">로그인</a> | <a href="${cp }/insertuser">회원가입</a>  
</form>
</body>
</html>