**메일 인증 기능
Mail Server Protocol : db의 값을 메일로 전송해주는 프로토콜
   Windows: Exchange Server
   Linux: SendMail, Qmail

-송신 : SMTP(Simple Mail Transfer Protocol) - 25번(보안 상의 이유로 이 포트넘버를 사용하진 않음)
-수신 : POP3(Post Office Protocol 3) - 110번

* naver mail server 활용 (네이버 메일이 보내는 사람이 되는 것)
메일 환경설정 -> POP3/IMAP 설정 -> POP3/SMTP 설정 -> 사용함+읽음 표시+원본 저장 -> 확인
IMAP/SMTP 설정 -> 사용함 -> 확인
아래로 내리면 각각
메일 프로그램 환경 설정 안내
스마트폰 메일 애플리케이션 계정 설정
이런게 있다 여기 있는 포트넘버를 사용할 것

-pom.xml : 이메일 라이브러리 추가
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-email</artifactId>
   <version>1.3.3</version>
</dependency>

-web.xml : servlet-mapping  <url-pattern>*.do</url-pattern>

-Controller.java

// Mail Server 설정 (환경설정 사용한 계정)
String charSet = "utf-8";
String hostSMTP = "smtp.naver.com";
String hostSMTPid = "~~~@naver.com";
String hostSMTPpwd = "~~~";  // 비밀번호 입력해야함

// 송신자로 뜨게 될 EMail, 제목, 내용
String fromEmail = "~~@naver.com";
String fromName = "친절한 홍길동씨";
String subject = "Overflow인증메일입니다.";

// 수신자 E-Mail 주소  ----> 회원정보에서 getEmail()로 받아와 집어넣게 될 값
String mail = "~~~@gmail.com";

try {
   HtmlEmail email = new HtmlEmail();  //email 라이브러리 임포트 - 객체 생성!
   email.setDebug(true);  //디버그
   email.setCharset(charSet);  //인코딩
   email.setSSL(true);  //보안 프로토콜
   email.setHostName(hostSMTP);   //호스트명
   email.setSmtpPort(587);   //호스트포트 : 보안 중이라 IMAP의 SMTP포트 사용 

   email.setAuthentication(hostSMTPid, hostSMTPpwd);
   email.setTLS(true);   //보안 프로토콜
   email.addTo(mail, charSet);  //누구에게 보낼건지
   email.setFrom(fromEmail, fromName, charSet);  //누가 보낼건지
   email.setSubject(subject);
   email.setHtmlMsg("<p align = 'center'>Overflow에 오신것을 환영합니다.</p><br>" 
    + "<div align='center'> 인증번호 : " + a + "</div>");
   email.send();
} catch (Exception e) {
   System.out.println(e);
}



** 회원 관리 - 파일 업로드
-pom.xml : 파일 업로드 라이브러리 추가 - 난수를 발생시켜 파일명 중복을 해결함
<dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
   <version>1.2</version>
</dependency>

-web.xml : servlet-mapping  <url-pattern>*.nhn</url-pattern>

-servlet-context.xml
1 어노테이션 빈 생성 <context:component-scan base-package="controller,service,dao" />

2 인터셉터 설정 (주로 db의 값과 비교해야 하는 검사)
<beans:bean id="sessionChk" class="controller.SessionCheckInter"/>

 <interceptors>
<interceptor>
   <mapping path="/member_edit.nhn"/>
   <mapping path="/member_edit_ok.nhn"/>
   <mapping path="/member_del.nhn"/>
   <mapping path="/member_del_ok.nhn"/>
   <mapping path="/member_logout.nhn"/>
   <beans:ref bean="sessionChk"/> //위에 생성된 bean 객체를 주입
</interceptor>
</interceptors>  
---> 세션영역에 공유되는 id값을 확인 후, 공유되는 id값이 없다면 login폼으로 넘어가게 하는 인터셉터!

3. 파일 업로드 설정 (최대 업로드 크기 제한 - 강제성은 없다고 함)
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="maxUploadSize" value="10000000"/> 
</beans:bean>

-configuration.xml : 별칭 관리
-mapper.xml : 어노테이션 설정?

-root-context.xml : mybatix ORM DB 연동 프레임워크 연결 (SessionFactory 객체 생성할 때 Location 경로 주의하기! 디렉토리 안에 들어있으면 디렉토리명까지 표기해야 함!★(실수 자주 하는 부분)

* 체크할 부분
1. 비밀번호 찾기 -> 메일 전송 라이브러리 활용, 회원의 아이디와 이름을 받아서 검색한 뒤 거기서 추출한 비밀번호를 이메일로 보내는 방식

2. 인터셉터 -> 로그인 상태에서 진행되어야 하는 작업의 경우 세션영역에 공유되는 id값이 있는지 확인

3. 파일 업로드 (프로필 사진 등록)
-> post방식 전송, enctype="multipart/form-data"
-> controller에서 파일명의 중복을 피하기 위해 난수를 발생시키는 메소드 확인 (RandomFile.java 참고- 아래에 있음!)


*member_join.jsp

<form name="f" method="post" action="member_join_ok.nhn"
 onsubmit="return check()" enctype="multipart/form-data">
//submit 눌렀을 때 유효성 검사 + 파일 업로드를 포함하고 있기 때문에 enctype="multipart/form-data"

지역번호 (핸드폰 등에서도 사용할 수 있는 방법)
<%@ include file="../../jsp/include/tel_number.jsp"%>  ---> 지역번호의 집합을 request 영역으로 공유하고 있는 jsp파일을 가져와 사용 (공유해야 하는 이유: 표현언어(EL)로 forEach문을 사용해야 하기 때문)
<select name="join_tel1" >      
   <c:forEach var="t" items="${tel}" begin="0" end="16">
      <option value="${t}">${t}</option>
   </c:forEach>        
</select>


*MemberAction.java (Controller)
@RequestMapping(value = "/member_join_ok.nhn", method = RequestMethod.POST)
   public String member_join_ok(@RequestParam("join_profile1") MultipartFile mf, //파일은 변수명이 서로 다르기 때문에 RequestParam으로 불러와 넣어줘야 함★
   MemberBean member,  //다른 폼 값은 dto로 넣을 수 있고
   HttpServletRequest request,  //파일이 저장될 디렉토리 위치를 불러오기 위함
    Model model   //결과를 model 객체로 view에 넘겨주기 위함
 ) throws Exception {
   String filename = mf.getOriginalFilename();   //입력받은 파일명 기입
   int size = (int) mf.getSize();   // 첨부파일의 크기 (단위:Byte), long형을 int형으로 강제형변환 필수★

※ 여기서 filename의 중복을 해결하는 방법
1 cos 라이브러리를 사용하거나 2 난수값으로 파일명을 변경해 저장해야 함
2번 방법을 설명할 것임

RandomFile.java

String extension = filename.substring(filename.lastIndexOf("."), filename.length());

   // 파일명의 . 을 기준으로 뒷부분을 저장 ---> 확장자!
UUID uuid = UUID.randomUUID();      //문자 형태의 난수를 발생시켜 변수 uuid에 저장
( universally unique identifier )
String newfilename = uuid.toString() + extension;
   //문자 형태의 난수에 확장자를 붙여 새로운 파일명인 newfilename으로 저장


다시 컨트롤러 설명
StringTokenizer st = new StringTokenizer(filename, ".");   // . 을 기준으로 확장자를 분리
   if(size > 100000){     //첫번째 조건 : 파일 사이즈 ---> 넘으면 db에 저장하지 않고 팝업창 페이지로 넘김
}else if(!file[1].equals("jpg") && !file[1].equals("gif") && !file[1].equals("png") ){
    //두번째 조건 : 이미지 확장자인지 ---> 이미지가 아니면 db에 저장하지 않고 팝업창 페이지로 넘김

if (size > 0) {   //위의 조건에 위배되지 않는 첨부파일이 저장된 경우
   mf.transferTo(new File(path + "/" + newfilename));   //새 파일명으로 디렉토리에 업로드
 }

+) 전화번호, 이메일 등 분리되어있는 값을 하나로 합쳐 dto에 저장해야 하는 것들을 처리한 후, 남은 dto에 저장 후 
memberService.insertMember(member);   // dto를 매개변수로 넘겨 insert를 수행할 수 있도록 함

return "redirect:member_login.nhn";   //view로 넘기지 않는 경우 redirect로 경로 재설정 -> 다른 controller 요청으로 넘어갈 수 있음

+ Recent posts