**메일 인증 기능
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 요청으로 넘어갈 수 있음
'수업 > 정리' 카테고리의 다른 글
220504 Spring-10 트랜잭션, 검색, 페이징, insert-delete방식 (0) | 2022.05.04 |
---|---|
220503 Spring-9 실습: 회원관리, 게시판관리 (0) | 2022.05.03 |
220429 Spring-7 MVC구현2 목록, 상세, 수정, 삭제 (0) | 2022.04.29 |
220428 Spring-6 MVC 구현1 환경설정, 작성 (0) | 2022.04.28 |
220427 Spring-5 DB 연결 (0) | 2022.04.27 |