sql
create table member(
member_uuid VARCHAR(100) not null,
member_id VARCHAR(100),
member_pw VARCHAR(200),
member_grant int(1),
member_last_login DATETIME,
member_inuse int(1),
member_regi_date DATETIME,
member_edit_date DATETIME,
primary key (member_uuid)
);
alter table member add member_email VARCHAR(200) after member_pw;
더보기
* 로직 : 아이디와 이메일 일치 확인후 임시비밀번호로 DB값 변경후 변경된 임시비밀번호 이메일로 전송
Member.VO
package egovframework.sample.vo;
import java.util.Date;
import lombok.Data;
@Data
public class Member {
private String memberUuid;
private String memberId;
private String memberPw;
private String memberEmail;
private int memberGrant;
private Date memberLastLogin;
private int memberInuse ;
private Date memberRegiDate;
private Date memberEditDate;
public Member() {}
public Member(String memberUuid, String memberId, String memberPw, String memberEmail, int memberGrant, Date memberLastLogin,
int memberInuse, Date memberRegiDate, Date memberEditDate) {
super();
this.memberUuid = memberUuid;
this.memberId = memberId;
this.memberPw = memberPw;
this.memberEmail = memberEmail;
this.memberGrant = memberGrant;
this.memberLastLogin = memberLastLogin;
this.memberInuse = memberInuse;
this.memberRegiDate = memberRegiDate;
this.memberEditDate = memberEditDate;
}
public Member(String memberUuid, String memberId, String memberEmail, String memberPw, Date memberEditDate) {
super();
this.memberUuid = memberUuid;
this.memberId = memberId;
this.memberEmail = memberEmail;
this.memberPw = memberPw;
this.memberEditDate = memberEditDate;
}
public Member(String memberUuid, int memberInuse, Date memberEditDate) {
super();
this.memberUuid = memberUuid;
this.memberInuse = memberInuse;
this.memberEditDate = memberEditDate;
}
public Member(String memberId, String memberPw, Date memberEditDate) {
this.memberId = memberId;
this.memberPw = memberPw;
this.memberEditDate = memberEditDate;
}
}
MemberService
package egovframework.sample.service;
import java.util.List;
import egovframework.sample.vo.Criteria;
import egovframework.sample.vo.Mail;
import egovframework.sample.vo.Member;
public interface MemberService {
void memberSave(Member member);
Member selectById(String memberId);
Member selectByUuid(String memberUuid);
void lastLoginUpdate(String memberUuid);
List<Member> memberList(Criteria cri);
void updateMember(Member member);
void delMember(Member member);
int idCheck(String memberId);
int emailCheck(Member member);
int selectCount();
String pwGenerate(Member member);
int emailDupl(String memberEmail);
}
GeneratePw (임시비밀번호코드 생성)
package egovframework.sample.service;
import java.util.Random;
import org.springframework.stereotype.Service;
@Service("GeneratePw")
public class GeneratePw{
private int pwdLength = 8;
private final char[] passwordTable = { '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', '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', '!', '@', '#', '$', '%', '^', '&', '*',
'(', ')', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' };
public String excuteGenerate() {
Random random = new Random(System.currentTimeMillis());
int tablelength = passwordTable.length;
StringBuffer buf = new StringBuffer();
for(int i = 0; i < pwdLength; i++) {
buf.append(passwordTable[random.nextInt(tablelength)]);
}
return buf.toString();
}
public int getPwdLength() {
return pwdLength;
}
public void setPwdLength(int pwdLength) {
this.pwdLength = pwdLength;
}
}
MemberServiceImpl
package egovframework.sample.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import egovframework.com.cmm.service.impl.CommonDAO;
import egovframework.sample.service.GeneratePw;
import egovframework.sample.service.MemberService;
import egovframework.sample.service.Sha256;
import egovframework.sample.vo.Criteria;
import egovframework.sample.vo.Member;
@Service("MemberService")
public class MemberServiceImpl implements MemberService {
@Resource(name = "CommonDAO")
private CommonDAO commonDAO;
@Resource(name = "GeneratePw")
private GeneratePw generatePw; //패스워드 자동 생성 서비스
@Override
public void memberSave(Member member) {
System.out.println(member+"받아오는지 테스트");
Member newMember = new Member(null, member.getMemberId(), Sha256.encrypt(member.getMemberPw()), member.getMemberEmail(), member.getMemberGrant(), null, 1, null, null);
commonDAO.insert("Member.saveMember", newMember);
System.out.println(newMember+"실행완료 테스트");
}
@Override
public Member selectById(String memberId) {
Member loginCheck = commonDAO.selectOne("Member.selectById", memberId);
return loginCheck;
}
@Override
public void lastLoginUpdate(String memberUuid) {
commonDAO.update("Member.lastLogin", memberUuid);
}
@Override
public List<Member> memberList(Criteria cri) {
List<Member> member = commonDAO.selectList("Member.selectMember", cri);
return member;
}
@Override
public Member selectByUuid(String memberUuid) {
Member mem = commonDAO.selectOne("Member.selectByUuid", memberUuid);
return mem;
}
@Override
public void updateMember(Member member) {
Member mem = new Member(member.getMemberUuid(), member.getMemberId(), member.getMemberEmail(), Sha256.encrypt(member.getMemberPw()), null);
commonDAO.update("Member.updateMember", mem);
}
@Override
public void delMember(Member member) {
Member mem = new Member(member.getMemberUuid(), 0, null); //inuse 상태 0:탈퇴
commonDAO.update("Member.deleteMember", mem);
}
@Override
public int idCheck(String memberId) {
int cnt = commonDAO.selectOne("Member.idCheck", memberId);
return cnt;
}
@Override
public int selectCount() {
return commonDAO.selectOne("Member.selectCount");
}
@Override
public int emailCheck(Member member) {
int cnt = commonDAO.selectOne("Member.emailCheck", member);
return cnt;
}
@Override
public int emailDupl(String memberEmail) {
int cnt = commonDAO.selectOne("Member.emailDupl", memberEmail);
return cnt;
}
@Override
public String pwGenerate(Member member) {
String temp = generatePw.excuteGenerate(); //비밀번호 생성
Member mem = new Member(member.getMemberId(), Sha256.encrypt(temp), null); //pw, date
commonDAO.update("Member.findPw", mem);
return temp;
}
@Override
public Member selectByEmail(String memberEmail) {
Member emailCheck = commonDAO.selectOne("Member.selectByEmail", memberEmail);
return emailCheck;
}
}
MailService
package egovframework.sample.service;
import java.util.Properties;
import javax.annotation.Resource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.springframework.stereotype.Service;
@Service("MailService")
public class MailService{
/** 메일 HOST **/
private static final String HOST = "smtp.naver.com";
/** 메일 PORT **/
private static final String PORT = "587";
/** 메일 ID **/
private static final String MAIL_ID = "naverid@naver.com";
/** 메일 PW **/
private static final String MAIL_PW = "naverpassword";
public static void sendNotiMail(String subejct, String address, String body) {
try {
InternetAddress add = new InternetAddress(address);
System.out.println("이메일 주소"+body);
// SMTP 발송 Properties 설정
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", MailService.HOST);
props.put("mail.smtp.port", MailService.PORT);
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.ssl.trust", MailService.HOST);
props.put("mail.smtp.auth", "true");
// SMTP Session 생성
Session mailSession = Session.getDefaultInstance(props, new javax.mail.Authenticator(){
protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
return new javax.mail.PasswordAuthentication(MailService.MAIL_ID, MailService.MAIL_PW);
}
});
// Mail 조립
Message mimeMessage = new MimeMessage(mailSession);
mimeMessage.setFrom(new InternetAddress(MailService.MAIL_ID));
mimeMessage.setRecipient(Message.RecipientType.TO, add);
// 메일 제목
mimeMessage.setSubject(subejct);
// 메일 본문 (.setText를 사용하면 단순 텍스트 전달 가능)
mimeMessage.setContent(body, "text/html; charset=UTF-8");
// Mail 발송
Transport.send(mimeMessage);
} catch(Exception e) {
e.printStackTrace();
}
}
}
Mailsender Contoller
package egovframework.sample.web;
import javax.mail.MessagingException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import egovframework.sample.service.MailService;
import egovframework.sample.service.MemberService;
import egovframework.sample.vo.Member;
import lombok.AllArgsConstructor;
@Controller
@AllArgsConstructor
public class MailSenderController {
private final MemberService memberService;
private final MailService mailService;
@PostMapping("/findPw") // 패스워드 변경 실행(이메일 보내기)
public String sendEmail(Member member) throws MessagingException {
String temp = memberService.pwGenerate(member); //아이디와 이메일 정보 넘겨받아 비밀번호 생성
Member mem = memberService.selectById(member.getMemberId());
String memberAddress = mem.getMemberEmail();
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("회원님의 임시 비밀번호는 "+ temp +"입니다. \n 로그인 후 꼭 비밀번호를 바꿔주세요."); // 엔터 수정하기
String body = stringBuffer.toString();
mailService.sendNotiMail("[안내] 임시 비밀번호 발급", memberAddress, body);
return "sample/sendOk";
}
}
MemberController
package egovframework.sample.web;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import egovframework.sample.service.MemberService;
import egovframework.sample.vo.Criteria;
import egovframework.sample.vo.Member;
import egovframework.sample.vo.PageMaker;
import lombok.AllArgsConstructor;
@Controller
@AllArgsConstructor
public class MemberController {
private final MemberService memberService;
@GetMapping("/findPw") //비밀번호 찾기
public String findPw(Model model, Member member) {
return "sample/findPw";
}
@GetMapping("/signin") //회원가입 페이지 이동
public String signin(Model model, Member member) {
return "sample/signin";
}
@GetMapping("/login") //회원가입 페이지 이동
public String login(Model model, Member member) {
return "sample/login";
}
@GetMapping("/loginOk") //일반회원 로그인 성공 페이지
public String loginOk(Model model, Member member) {
return "sample/loginOk";
}
@GetMapping("/logout") //로그아웃
public String logout(Model model, Member member, HttpSession session) {
session.invalidate();
return "sample/login";
}
@GetMapping("/adminOk") //관리자 로그인 성공 페이지
public String admin(Model model, Member member) {
return "sample/adminOk";
}
@GetMapping("/accessFail") //접근제한 페이지
public String accessFail(Model model, Member member) {
return "sample/accessFail";
}
@GetMapping("/memberList") //회원목록
public String memberList(Model model, Member member, Criteria cri) {
List<Member> mem = memberService.memberList(cri); //criteria로 페이지 수 세서 보드 조회
model.addAttribute("member", mem);
PageMaker pm = new PageMaker();
pm.setCri(cri);
pm.setTotalCount(memberService.selectCount());
model.addAttribute("pm", pm);
return "sample/memberList";
}
@GetMapping("/member/edit/{memberUuid}")
public String editMember(@PathVariable("memberUuid") String memberUuid, Model model, Member member) {
Member mem = memberService.selectByUuid(memberUuid);
model.addAttribute("member", mem);
return "sample/memberEdit";
}
}
MemberRestController (생성자 주입방식으로 변경)
package egovframework.sample.web;
import java.io.IOException;
import java.util.regex.Pattern;
import javax.servlet.http.HttpSession;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import egovframework.sample.service.MailService;
import egovframework.sample.service.MemberService;
import egovframework.sample.service.ResponseService;
import egovframework.sample.service.Sha256;
import egovframework.sample.vo.ErrorCode;
import egovframework.sample.vo.Member;
import egovframework.sample.vo.SingleResult;
import lombok.AllArgsConstructor;
@RestController
@AllArgsConstructor
public class MemberRestController {
private final MemberService memberService;
private final ResponseService responseService;
private final MailService mailService;
@PostMapping("/signin") //회원가입실행 +이메일 존재여부 추가할것
public SingleResult<?> signin(@RequestBody Member member) throws IOException {
String regex = "^[a-zA-Z]{1}[a-zA-Z0-9_]{4,11}$"; //아이디 정규식
String pw_regex = "^.*(?=^.{8,16}$)(?=.*\\d)(?=.*[a-zA-Z])(?=.*[!@#$%^&+=]).*$"; //패스워드 정규식 8~16자 이내
String email_regex = "^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$"; //이메일 형식
try {
if(member.getMemberId()==null || member.getMemberId().equals("") || member.getMemberPw()==null|| member.getMemberPw().equals("") ||
member.getMemberEmail()==null || member.getMemberEmail().equals("")) { // 받아온값이 null - 아이디, 패스워드 따로하면 유추가능하니까 안됨.
return responseService.getFailResult(ErrorCode.NULL_EXCEPTION);
}else if(member.getMemberGrant()!=0 && member.getMemberGrant()!=1) { //&& 주의할것, 0도 아니고 1도 아닐때
return responseService.getFailResult(ErrorCode.TYPE_NOT_SELECTED);
}else if(!Pattern.matches(pw_regex, member.getMemberPw())) {//비밀번호가 정규식에 부합하는지
return responseService.getFailResult(ErrorCode.PW_NOT_FOLLOW_REGEX);
}else if(!Pattern.matches(email_regex, member.getMemberEmail())) { //이메일이 정규식에 부합하는지
return responseService.getFailResult(ErrorCode.EMAIL_NOT_FOLLOW_REGEX);
}else if(!Pattern.matches(regex, member.getMemberId())) {//아이디가 정규식에 부합하는지
return responseService.getFailResult(ErrorCode.ID_NOT_FOLLOW_REGEX);
}else {
Member mem = memberService.selectById(member.getMemberId()); //멤버 존재여부 Member mem = null;
//Member memByEmail = memberService.selectByEmail(member.getMemberEmail());
if(mem==null) {//새로 회원가입
memberService.memberSave(member); //회원가입진행
mailService.sendNotiMail("[안내] 회원가입을 축하합니다!", member.getMemberEmail(), "오늘부터 당신은 OOO의 회원입니다. 많은 이용 바랍니다.");
return responseService.getSingleResult(member);
}else if(mem.getMemberId().equals(member.getMemberId()) && mem.getMemberInuse()==1) { //아이디 이미 존재 & 사용하는중이면
return responseService.getFailResult(ErrorCode.ID_DUPLICATION);
}else if(mem.getMemberEmail().equals(member.getMemberEmail()) && mem.getMemberInuse()==1) { //이메일 이미 존재 & 사용하는중이면
return responseService.getFailResult(ErrorCode.EMAIL_DUPLICATION);
}
}
}catch (Exception e) {
e.printStackTrace();
}
return responseService.getSingleResult(member);
}
@PostMapping("/login") //로그인 실행
public SingleResult<?> login(@RequestBody Member member, HttpSession session) throws IOException {
try {
String memberId = member.getMemberId();
String memberPw = member.getMemberPw();//폼에서 가져온 아이디
String encodingPw = Sha256.encrypt(memberPw); //폼에서 가져온 아이디 encoding
int memberType=0; //0:로그인안됨 1:일반회원 2:관리자
if(memberId ==null || memberId.equals("")) { // 받아온값이 null - 아이디, 패스워드 따로하면 유추가능하니까 안됨.
return responseService.getFailResult(ErrorCode.NULL_EXCEPTION);
}else if(memberPw ==null|| memberPw.equals("")) { // 받아온값이 null - 아이디, 패스워드 따로하면 유추가능하니까 안됨.
return responseService.getFailResult(ErrorCode.NULL_EXCEPTION);
}
Member check = memberService.selectById(member.getMemberId()); //아이디로 db에서 찾은정보
if(check!=null) { //아이디는 있을때
if(memberId.equals(check.getMemberId()) && encodingPw.equals(check.getMemberPw()) ){ //사용자가 입력한 pw 가db와 일치하는지
System.out.print("로그인 정보가 일치합니다");
memberType=1;
if(memberId.equals("admin")) {
memberType=2;
System.out.print("#############관리자 로그인");
//로그인 성공시 마지막 로그인 날짜 수정
memberService.lastLoginUpdate(check.getMemberUuid());
}
//로그인 성공시 마지막 로그인 날짜 수정
memberService.lastLoginUpdate(check.getMemberUuid());
//세션에 저장
session.setAttribute("memberInfo", member);
} else if(!memberId.equals(check.getMemberId()) || !encodingPw.equals(check.getMemberPw()) ) {
System.out.print("아이디와 패스워드가 일치하지 않습니다.");
memberType=3;
}
}else if(check==null){
System.out.print("회원정보 존재하지않음");
memberType=0;
}
return responseService.getSingleResult(memberType);
} catch (NullPointerException e){
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;////////////////////여기 이렇게 써도되는지?
}
@PostMapping("/member/del")
public SingleResult<?> deleteMember(Member member, @RequestBody String uuid) throws IOException {
Member mem = memberService.selectByUuid(uuid);
memberService.delMember(mem); //inuse 번호만 바꿈.
return responseService.getSingleResult(mem);
}
@PostMapping("/idCheck") // 중복 아이디 체크
public SingleResult<?> idCheck(@RequestBody String memberId) throws IOException {
int check= memberService.idCheck(memberId);
return responseService.getSingleResult(check);
}
@PostMapping("/emailDupl") // 중복 이메일 체크
public SingleResult<?> emailDupl(@RequestBody String memberEmail) throws IOException {
int check= memberService.emailDupl(memberEmail);
return responseService.getSingleResult(check);
}
@PostMapping("/emailCheck") // 아이디, 이메일 일치 체크
public SingleResult<?> emailCheck(@RequestBody Member member) throws IOException {
int check= memberService.emailCheck(member);
return responseService.getSingleResult(check);
}
@PostMapping("/member/editMember") // 수정된 정보 받아오기
public SingleResult<?> editMemberPost(Model model, @RequestBody Member member) throws IOException {
String pw_regex = "^.*(?=^.{8,16}$)(?=.*\\d)(?=.*[a-zA-Z])(?=.*[!@#$%^&+=]).*$"; //패스워드 정규식 8~16자 이내
String email_regex = "^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$"; //이메일 형식
try {
Member mem = memberService.selectById(member.getMemberId()); //수정하는 아이디로 정보 가져오기
if(member.getMemberId()==null || member.getMemberId().equals("") || member.getMemberPw()==null|| member.getMemberPw().equals("") ||
member.getMemberEmail()==null || member.getMemberEmail().equals("")) { // 받아온값이 null - 아이디, 패스워드 따로하면 유추가능하니까 안됨.
return responseService.getFailResult(ErrorCode.NULL_EXCEPTION);
}else if(!Pattern.matches(pw_regex, member.getMemberPw())) {//비밀번호가 정규식에 부합하는지
return responseService.getFailResult(ErrorCode.PW_NOT_FOLLOW_REGEX);
}else if(!Pattern.matches(email_regex, member.getMemberEmail())) { //이메일이 정규식에 부합하는지
return responseService.getFailResult(ErrorCode.EMAIL_NOT_FOLLOW_REGEX);
}else {
//중복테스트 : inuse가 1인것만 가져옴
int checkDupl = memberService.emailDupl(member.getMemberEmail()); //0: 새로운이메일 , 1:존재이메일, 2:다중
int checkId = memberService.emailCheck(member); // 0:아이디 이메일 불일치, 1:일치
if(checkId==1) {
System.out.println("사용가능한 이메일(기존메일)");
memberService.updateMember(member);
return responseService.getSingleResult(member);
}else if(checkId==0) {
if(checkDupl>1) {
System.out.println("이미 db에 두개 있는경우");
return responseService.getFailResult(ErrorCode.EMAIL_DUPLICATION);
}else if(checkDupl==1) {
System.out.println("다른 아이디 + 중복이메일 db에 1개 있는 경우");
return responseService.getFailResult(ErrorCode.EMAIL_DUPLICATION);
}else if(checkDupl==0) {
System.out.println("사용가능한 이메일");
memberService.updateMember(member);
return responseService.getSingleResult(member);
}
}
}
} catch (NullPointerException e){
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return responseService.getSingleResult(member);
}
}
Mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Member">
<insert id="saveMember" parameterType="egovframework.sample.vo.Member">
<selectKey resultType="String" keyProperty="memberUuid" order="BEFORE">
select FN_GET_UUID('M') as memberUuid
</selectKey>
INSERT INTO member
VALUES(#{memberUuid},#{memberId},#{memberPw},#{memberEmail},#{memberGrant},NOW(),#{memberInuse},NOW(),NOW())
</insert>
<select id="idCheck" resultType="int"><!-- 아이디 중복 체크 -->
SELECT count(member_id)
FROM member
WHERE member_id=#{member_id} and member_inuse=1
</select>
<select id="emailCheck" resultType="int"><!-- 아이디 이메일 일치 체크 -->
SELECT count(member_id)
FROM member
WHERE member_id=#{memberId} and member_email=#{memberEmail}
</select>
<select id="emailDupl" resultType="int"><!-- 이메일 중복 체크 -->
SELECT count(member_email)
FROM member
WHERE member_email=#{memberEmail} and member_inuse=1
</select>
<select id="selectById" resultType="egovframework.sample.vo.Member">
SELECT
member_uuid, member_id, member_pw, member_grant, member_last_login, member_inuse, member_regi_date, member_edit_date, member_email
FROM member
WHERE member_id=#{member_id} and member_inuse=1
</select>
<select id="selectByEmail" resultType="egovframework.sample.vo.Member">
SELECT
member_uuid, member_id, member_pw, member_grant, member_last_login, member_inuse, member_regi_date, member_edit_date, member_email
FROM member
WHERE member_email=#{memberEmail} and member_inuse=1
</select>
<select id="selectByUuid" resultType="egovframework.sample.vo.Member">
SELECT
member_uuid, member_id, member_pw, member_grant, member_last_login, member_inuse, member_regi_date, member_edit_date, member_email
FROM member
WHERE member_uuid=#{memberUuid}
</select>
<select id="selectMember" resultType="egovframework.sample.vo.Member">
SELECT *
FROM member
WHERE member_inuse=1
ORDER BY member_regi_date desc
limit #{pageStart},#{pageSize}
</select>
<update id="lastLogin" parameterType="egovframework.sample.vo.Member">
UPDATE member
SET member_last_login=NOW(), member_edit_date=NOW()
WHERE member_uuid=#{memberUuid}
</update>
<update id="updateMember" parameterType="egovframework.sample.vo.Member">
UPDATE member
SET member_id=#{memberId}, member_email=#{memberEmail}, member_pw=#{memberPw}, member_edit_date=NOW()
WHERE member_uuid=#{memberUuid}
</update>
<update id="deleteMember" parameterType="egovframework.sample.vo.Member">
UPDATE member
SET member_edit_date=NOW(), member_inuse=#{memberInuse}
WHERE member_uuid=#{memberUuid}
</update>
<select id="selectCount" resultType="int">
SELECT count(*) FROM member
WHERE member_inuse=1
</select>
<update id="findPw" parameterType="egovframework.sample.vo.Member"><!-- 아이디로 임시비밀번호 변경 -->
UPDATE member
SET member_pw=#{memberPw}, member_edit_date=NOW()
WHERE member_id=#{memberId}
</update>
</mapper>
Signin.jsp (이메일 추가)
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<title>회원가입</title>
<style>
body{font-family: 'Noto Sans KR', sans-serif;}
h2{text-align: left;}
a:link {color: black;}
a:visited {color: black;}
a:hover {color: black; text-decoration: none;}
a:active {color: black;}
</style>
</head>
<body>
<br><br>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-4">
<div class="justify-content-center" style="text-align: center">
<h2>회원가입</h2><br>
<div class="container-sm" id="tb">
<form:form name="memberForm" id="memberForm">
<table class="table table-bordered">
<tr><td>아이디</td><td><input type="text" style="width:200px;" id="memberId" name="memberId" oninput="idcheck()"/>
<div id="idcheck"></div>
</td></tr>
<tr><td>이메일</td><td><input type="text" style="width:200px;" id="memberEmail" name="memberEmail" oninput="emailCheck()"/>
<div id="msg"></div></td></tr>
<tr><td>비밀번호</td><td><input type="password" style="width:200px;" id="memberPw" name="memberPw" onkeyup="enterkey()"/></td></tr>
<tr><td>회원타입</td><td><input type="radio" name="memberGrant" value="0"/>관리자
<input type="radio" name="memberGrant" value="1"/>일반회원</td></tr>
<tr><td colspan="2">
<input type="button" value="회원가입" onclick="validation()"></td></tr>
</table>
</form:form>
</div>
<div id="msg"></div>
</div>
</div>
</div>
</div>
<script>
function validation() { //이메일 정규식 추가
var idcheck = document.forms["memberForm"]["memberId"].value;
var pwcheck = document.forms["memberForm"]["memberPw"].value;
var emailcheck = document.forms["memberForm"]["memberEmail"].value;
var memberGrant = document.forms["memberForm"]["memberGrant"].value;
var regExp = /^[A-Za-z]{1}[A-Za-z0-9_-]{3,11}$/; //아이디 정규식
var pwExp = /^(?=.*[a-zA-Z])((?=.*\d)(?=.*\W)).{8,16}$/; //비밀번호 정규식
var emailregExp = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i; //이메일 정규식
var tb = document.getElementById('tb');
var msg = document.getElementById('msg');
if (idcheck == null || idcheck == "") {
msg.innerHTML = "아이디가 입력되지 않았습니다.";
tb.append(msg);
return false;
} else if (pwcheck == null || pwcheck == "") {
msg.innerHTML = "비밀번호가 입력되지 않았습니다";
tb.append(msg);
return false;
} else if (memberGrant == null || memberGrant == "") {
msg.innerHTML = "회원타입을 선택해 주세요";
tb.append(msg);
return false;
} else if(!regExp.test(idcheck)) {
alert('아이디 첫글자는 영문이어야하며 4~12자의 영문 대소문자와 숫자,하이픈,언더바 사용가능')
return false;
} else if(!pwExp.test(pwcheck)) {
alert('비밀번호는 영문/숫자/특수문자(!@#$%^&*)를 포함하여 8~16자로 입력해야합니다.')
return false;
} else if(!emailregExp.test(emailcheck)) {
alert('이메일 형식이 맞지 않습니다.')
return false;
} else{
$.ajax({
url: "/emailDupl",
type: "POST",
data: JSON.stringify(emailcheck),
dataType: "JSON",
contentType: "application/json",
accept: "application/json",
success: function(result) {
if(result.data ==1){
alert("이메일 중복입니다. 다른 이메일을 입력해주세요.");
}else if(result.data ==0){ //이메일 통과
$.ajax({
url: "/idCheck",
type: "POST",
data: JSON.stringify(idcheck),
dataType: "JSON",
contentType: "application/json",
accept: "application/json",
success: function(result) {
if(result.data ==1){// 아이디 중복
alert("아이디 중복입니다. 다른 아이디를 입력해주세요.");
}else if(result.data ==0){
signin();//******모두 통과하면 실행
}
},
error: function(result) {
console.log(result.responseText); //responseText의 에러메세지 확인
}
});
}
},
error: function(result) {
console.log(result.responseText); //responseText의 에러메세지 확인
}
});
}
}
function enterkey() {
if (window.event.keyCode == 13) {
validation();
}
}
function idcheck(){ //아이디 입력시
var memberId = document.forms["memberForm"]["memberId"].value;
$.ajax({
url: "/idCheck",
type: "POST",
data: JSON.stringify(memberId),
dataType: "JSON",
contentType: "application/json",
accept: "application/json",
success: function(result) {
console.log(result.data);
console.log(result);
if(result.data ==1){// 아이디 중복
document.getElementById("idcheck").innerHTML = "<span style='color: red;'>아이디 중복</span>";
}else if(result.data ==0){
document.getElementById("idcheck").innerHTML = "<span style='color: green;'>사용가능한 아이디</span>";
}
},
error: function(result) {
console.log(result.responseText); //responseText의 에러메세지 확인
}
});
}
function emailCheck(){
var memberEmail = document.forms["memberForm"]["memberEmail"].value;
$.ajax({
url: "/emailDupl",
type: "POST",
data: JSON.stringify(memberEmail),
dataType: "JSON",
contentType: "application/json",
accept: "application/json",
success: function(result) {
if(result.data ==1){
document.getElementById("msg").innerHTML = "<span style='color: red;'>이메일 중복</span>";
}else if(result.data ==0){
document.getElementById("msg").innerHTML = "<span style='color: green;'>사용가능한 이메일</span>";
}else if(memberId==null|| memberId==''){
document.getElementById("msg").innerHTML = "<span style='color: green;'>이메일을 입력해주세요</span>";
}
},
error: function(result) {
console.log(result.responseText); //responseText의 에러메세지 확인
}
});
}
function signin(){
let memberId = document.forms["memberForm"]["memberId"].value;
let memberPw = document.forms["memberForm"]["memberPw"].value;
let memberEmail = document.forms["memberForm"]["memberEmail"].value;
//라디오 버튼 값 가져오기
let checked = document.getElementsByName('memberGrant');
let radiocheck = Array.from(checked).find(radio => radio.checked);
let memberGrant = radiocheck.value;
var data = {
'memberId' : memberId,
'memberPw' : memberPw,
'memberEmail' : memberEmail,
'memberGrant' : memberGrant
};
$.ajax({
url: "/signin", //회원가입완료
type: "POST",
data: JSON.stringify(data),
dataType: "JSON",
contentType: "application/json",
accept: "application/json",
success: function(result) {
console.log(result.data);
console.log("전송/저장 성공");
alert('회원가입이 완료되었습니다. 다시 로그인해 주세요');
location.href="../login";
},
error: function(result) {
console.log(result.data);
alert('회원가입 실패. 다시 시도해 주세요');
console.log(result.responseText); //responseText의 에러메세지 확인
}
});
}
</script>
</body>
</html>
findPw.jsp
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@page isELIgnored="false" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<title>비밀번호 찾기</title>
<style>
body{font-family: 'Noto Sans KR', sans-serif;}
h2{text-align: left;}
a:link {color: black;}
a:visited {color: black;}
a:hover {color: black; text-decoration: none;}
a:active {color: black;}
</style>
</head>
<body>
<br><br>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-4">
<h2>비밀번호 찾기</h2>
<div class="justify-content-center" style="text-align: center">
<form:form action="/findPw" name="memberEditForm" id="memberEditForm" method="POST">
<table class="table table-bordered">
<tr>
<td style="text-align:center;">아이디</td>
<td><input type="text" name="memberId" id="memberId"></td>
</tr>
<tr>
<td style="text-align:center;">이메일</td>
<td><input type="text" name="memberEmail" id="memberEmail" oninput="emailCheck()" onkeyup="enterkey()"><div id="emailCheck"></div></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="비밀번호 찾기"></td>
</tr>
</table>
</form:form>
</div>
</div>
</div>
</div>
<script>
function enterkey() {
if (window.event.keyCode == 13) {
memberEditForm.submit();
}
}
function emailCheck(){ //아이디 입력시
var memberId = document.forms["memberEditForm"]["memberId"].value;
var memberEmail = document.forms["memberEditForm"]["memberEmail"].value;
var data = {
'memberId': memberId,
'memberEmail' : memberEmail
};
$.ajax({
url: "/emailCheck",
type: "POST",
data: JSON.stringify(data),
dataType: "JSON",
contentType: "application/json",
accept: "application/json",
success: function(result) {
if(result.data ==0){
document.getElementById("emailCheck").innerHTML = "<span style='color: red;'>아이디와 이메일이 일치하지 않습니다.</span>";
}else if(result.data ==1){
document.getElementById("emailCheck").innerHTML = "<span style='color: green;'>아이디와 이메일이 일치 합니다.</span>";
}else if(memberId==null|| memberId==''){
document.getElementById("emailCheck").innerHTML = "<span style='color: green;'>아이디를 입력해주세요</span>";
}
},
error: function(result) {
console.log(result.responseText); //responseText의 에러메세지 확인
}
});
}
</script>
</body>
</html>
MemberEdit.jsp
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@page isELIgnored="false" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<title>회원정보 수정</title>
<style>
body{font-family: 'Noto Sans KR', sans-serif;}
h2{text-align: left;}
a:link {color: black;}
a:visited {color: black;}
a:hover {color: black; text-decoration: none;}
a:active {color: black;}
</style>
</head>
<body>
<br><br>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-4">
<h2>회원정보 수정</h2>
<div class="justify-content-center" style="text-align: center">
<form:form action="/member/editMember" name="memberEditForm" id="memberEditForm" method="POST">
<table class="table table-bordered">
<tr>
<td style="text-align:center;">아이디</td>
<td><input type="text" name="memberId" id="memberId" value="${member.memberId}" readonly></td>
</tr>
<tr>
<td style="text-align:center;">비밀번호</td>
<td><input type="password" name="memberPw" id="memberPw"><input type="hidden" name="memberUuid" id="memberUuid" value="${member.memberUuid}"></td>
</tr>
<tr><td>이메일</td><td><input type="text" id="memberEmail" name="memberEmail" value="${member.memberEmail}" oninput="emailCheck()" onkeyup="enterkey()"><div id="msg"></div></td>
</tr>
<tr>
<td colspan="2"><input type="button" value="회원정보 수정" onclick="validation()"></td>
</tr>
</table>
</form:form>
<div id="msg"></div>
</div>
</div>
</div>
</div>
<script>
function validation() {
var pwcheck = document.forms["memberEditForm"]["memberPw"].value;
var emailcheck = document.forms["memberEditForm"]["memberEmail"].value;
var memberId = document.forms["memberEditForm"]["memberId"].value;
var memberUuid = document.forms["memberEditForm"]["memberUuid"].value;
var pwExp = /^(?=.*[a-zA-Z])((?=.*\d)(?=.*\W)).{8,16}$/; //비밀번호 정규식
var emailregExp = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i; //이메일 정규식
var tb = document.getElementById('tb');
var msg = document.getElementById('msg');
if (pwcheck == null || pwcheck == "") {
msg.innerHTML = "비밀번호가 입력되지 않았습니다";
tb.append(msg);
return false;
} else if(!pwExp.test(pwcheck)) {
alert('비밀번호는 영문/숫자/특수문자(!@#$%^&*)를 포함하여 8~16자로 입력해야합니다.')
return false;
} else if(!emailregExp.test(emailcheck)) {
alert('이메일 형식이 맞지 않습니다.')
return false;
} else{
var memberId = document.forms["memberEditForm"]["memberId"].value;
var memberEmail = document.forms["memberEditForm"]["memberEmail"].value;
var data = {
'memberId': memberId,
'memberEmail' : memberEmail
};
$.ajax({
url: "/emailCheck", //아이디 이메일 일치여부. 0:불일치 1:일치
type: "POST",
data: JSON.stringify(data),
dataType: "JSON",
contentType: "application/json",
accept: "application/json",
success: function(result) {
if(result.data ==1){ //원래 이메일 주소 사용할수 있게 하기 위함.
send();
}else if(result.data ==0 ){ //새로운 이메일 주소
$.ajax({
url: "/emailDupl", //갯수만
type: "POST",
data: JSON.stringify(memberEmail),
dataType: "JSON",
contentType: "application/json",
accept: "application/json",
success: function(result) {
if(result.data >1){ //이미 db에 두개 있는경우
alert("이메일 다중 중복");
}else if(result.data ==1){ //db에 있는경우
alert("이메일 주소가 사용중입니다. 이메일을 다시 확인해주세요.");
}else if(result.data ==0){ //db에 없는 아예 새로운 이메일
send();
}
/* if(result.code=="400"){ //이미 db에 두개 있는경우
alert("이메일 다중 중복");
console.log(result.code +" :" +result.message);
}else if(result.status=="407"){ //db에 있는경우
alert("이메일 주소가 사용중입니다. 이메일을 다시 확인해주세요.");
console.log(result.code +" :" +result.message);
}else if(result.code=="200"){ //db에 없는 아예 새로운 이메일
send();
} */
},
error: function(result) {
console.log(result.responseText); //responseText의 에러메세지 확인
}
});
}else if(memberId==null|| memberId==''){
document.getElementById("msg").innerHTML = "<span style='color: green;'>이메일을 입력해주세요</span>";
}
},
error: function(result) {
console.log(result.responseText); //responseText의 에러메세지 확인
}
});
}
}
function send(){ //보내는 기능만 함
var pwcheck = document.forms["memberEditForm"]["memberPw"].value;
var emailcheck = document.forms["memberEditForm"]["memberEmail"].value;
var memberId = document.forms["memberEditForm"]["memberId"].value;
var memberUuid = document.forms["memberEditForm"]["memberUuid"].value;
var data = {
'memberId': memberId,
'memberPw' : pwcheck,
'memberEmail' : emailcheck,
'memberUuid' : memberUuid
};
$.ajax({
url: "/member/editMember",
type: "POST",
data: JSON.stringify(data),
dataType: "JSON",
contentType: "application/json",
accept: "application/json",
success: function(result) {
alert("수정이 완료되었습니다.");
location.href='/memberList';
},
error: function(result) {
console.log(result.responseText); //responseText의 에러메세지 확인
}
});
}
function enterkey() {
if (window.event.keyCode == 13) {
validation();
}
}
function emailCheck(){
var memberId = document.forms["memberEditForm"]["memberId"].value;
var memberEmail = document.forms["memberEditForm"]["memberEmail"].value;
var data = {
'memberId': memberId,
'memberEmail' : memberEmail
};
$.ajax({
url: "/emailCheck",
type: "POST",
data: JSON.stringify(data),
dataType: "JSON",
contentType: "application/json",
accept: "application/json",
success: function(result) {
if(result.data ==1){
document.getElementById("msg").innerHTML = "<span style='color: green;'>사용가능한 이메일 (변경없음)</span>"; //본인 이메일주소
}else if(result.data ==0 ){ //새로운 이메일 주소
$.ajax({
url: "/emailDupl", //이메일 중복 갯수만
type: "POST",
data: JSON.stringify(memberEmail),
dataType: "JSON",
contentType: "application/json",
accept: "application/json",
success: function(result) {
if(result.data >1){ //이미 db에 두개 있는경우
document.getElementById("msg").innerHTML = "<span style='color: red;'>이메일 다중 중복</span>";
}else if(result.data ==1){ //db에 있는경우
document.getElementById("msg").innerHTML = "<span style='color: red;'>사용중인 이메일</span>";
}else if(result.data ==0){ //db에 없는 아예 새로운 이메일
document.getElementById("msg").innerHTML = "<span style='color: green;'>사용가능한 이메일</span>";
}
},
error: function(result) {
console.log(result.responseText); //responseText의 에러메세지 확인
}
});
}else if(memberId==null|| memberId==''){
document.getElementById("msg").innerHTML = "<span style='color: green;'>이메일을 입력해주세요</span>";
}
},
error: function(result) {
console.log(result.responseText); //responseText의 에러메세지 확인
}
});
}
</script>
</body>
</html>
728x90
'Learning > JAVA' 카테고리의 다른 글
스프링부트 Interceptor 적용하기 (0) | 2022.11.03 |
---|---|
JSTL 날짜포맷 변경 (0) | 2022.08.17 |
return redirect:/ (0) | 2022.07.20 |
Google/Kakao Map Api 사용방법 (0) | 2022.07.15 |
Egov Framework 초기설정 (0) | 2022.07.13 |