회원 가입 시 email을 받고 인증 코드를 생성,
해당 email 계정으로 인증 처리 메일을 보내보자!
관리자가 보낸 인증코드가 맞다면 인증 완료처리까지-
먼저 mySQL에서 컬럼 추가해준다.
-- 인증코드와 verify 확인 코드
ALTER TABLE `project_01`.`memberinfo`
ADD COLUMN `code` VARCHAR(25) NULL AFTER `REGDATE`,
ADD COLUMN `verify` CHAR(1) NULL DEFAULT 'N' AFTER `code`,
ADD COLUMN `email` VARCHAR(45) NULL AFTER `verify`;
DAO 변경
//verify
public int updateVerify(String id, String code);
public int updateEmail(Member member);
Mapper. xml
변경
<!-- result map 설정 추가 -->
<resultMap type="com.ny.mm.model.Member" id="MemberVO">
<result property="idx" column="idx"/>
<result property="id" column="id"/>
<result property="pw" column="pw"/>
<result property="name" column="name"/>
<result property="photo" column="photo"/>
<result property="regDate" column="regdate"/>
<result property="code" column="code"/>
<result property="verify" column="verify"/>
<result property="email" column="email"/>
</resultMap>
<!-- 회원가입시 code, email도 DB에 연결해주기 -->
<insert id="insertMember" parameterType="com.ny.mm.model.Member">
insert into project_01.memberinfo (ID, PW, NAME, PHOTO, CODE, EMAIL)
values (#{id}, #{pw}, #{name}, #{photo}, #{code}, #{email})
</insert>
<!-- 인증 확인 처리 -->
<update id="updateVerify">
update project_01.memberinfo
set verify = 'Y'
where id = #{param1}
and code = #{param2}
</update>
변경해야 할 java 파일 :
-Member.java
-JoinRestApiRequest.java //회원 가입 시 받는 객체
-LoginInfo.java //로그인 할 때 생성하는 객체
-VerifyMember.java : 새로 생성하는 파일
@JsonIgnore
private String code;
private char verify;
private String email;
public Member(String id, String email) {
this.id = id;
this.email = email;
randomCode();
}
//영대소문자+숫자 난수
public void randomCode() {
StringBuffer temp = new StringBuffer();
Random rnd = new Random();
String str = String.valueOf( (char) (rnd.nextInt(26) + 97) );
for(int i = 0; i < 10; i++) { //10자리 난수발생
int index = rnd.nextInt(3); //숫자 012 중에서 난수 발생시킴
switch (index) {
case 0:
//97~122 a-z의 아스키코드
temp.append((char)(rnd.nextInt(26) + 97));
break;
case 1:
temp.append((char)(rnd.nextInt(26) + 65));
break;
case 2:
temp.append(rnd.nextInt(10));
break;
}
}
System.out.println("난수코드생성: " + temp);
setCode(temp.toString());
}
다른 파일들은 변수 추가하고 getter, setter 설정과 toString 오버라이딩 정도로 하면 됨.
MailSenderService.java 파일 생성
JoinService 파일 변경
@Service("mailSenderService")
public class MailSenderService {
@Autowired
private JavaMailSender sender;
public int send(Member member) {
int result = 0;
MimeMessage message = sender.createMimeMessage();
String name = member.getName() + " 님";
String email = member.getEmail();
String id = member.getId();
String code = member.getCode();
try {
message.setSubject("[info] Welcome TO Our WEBSITE", "utf-8");
String htmlMsg = "<h1>회원가입을 축하합니다~</h1>";
htmlMsg += "<h1>사랑합니다 "+name+"!</h1>";
htmlMsg += "<a href = \"http://localhost:8080/mm/join/verify?id="+id+"&code="+code+"\">인증하기 클릭</a>";
message.setText(htmlMsg, "utf-8", "html");
message.addRecipient(RecipientType.TO,
new InternetAddress(email, name, "utf-8"));
sender.send(message);
} catch (MessagingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return 1;
}
}
id를 이메일 계정으로 받지 않고 이메일 계정을 따로 만들었으므로, 보낼 때 id, name, email
등등 여러가지를 parameter
로 넘기는게 번거로워서 Member
객체로 바로 넘겨버림.
인증을 할 때 <a>
태그에 가입한 사람의 아이디와 코드를 보내준다.
mail 보내는 설정을 자세하게 알고싶다면 여기 로
@Autowired
private MailSenderService mailService;
//가입 서비스 rest + email 사용
public int joinMember( HttpServletRequest request,
JoinRestApiRequest joinMember
) {
/*생략*/
//파일 올렸을 때
if(joinMember.getPhoto() != null) {
//file을 서버의 지정 경로에 저장.
newFileName = System.nanoTime() + "_" + joinMember.getId();
joinMember.getPhoto().transferTo(new File(dir, newFileName));
//데이터베이스 저장을 하기위한 파일이름 세팅
memberinfo.setPhoto(newFileName);
}
result = dao.insertMember(memberinfo);
mailService.send(memberinfo);
/*생략*/
return result;
}
join을 하면서 바로 같이 mailService
의 send
메서드를 통해 인증메일 보냄.
@Controller
public class VerifyController {
@Autowired
private VerifyService verifyService;
@RequestMapping("/join/verify")
public String verify(@RequestParam("id")String id,
@RequestParam("code")String code) {
return "join/verify_" + verifyService.verify(id, code);
}
}
인증처리가 제대로 되었다면 join/verify_Y로, 아니라면 join/verify_N 이라는 이름의 view로 들어가게 설정
메일함을 열어본다면 이렇게 나온다