프로젝트

프로젝트진행중 - 회원가입 , 로그인?

동곤일상 2025. 5. 12. 23:08
반응형

1) 회원가입관련

-필요한메서드

-controller

-dao

-mapper

2) 로그인 , 로그아웃 , index(메인화면) 연결

-index매핑의 문제점

-sitemesh변경

- index.jsp(메인) 의 우측상단작업 및 절대경로변환

 


1) 회원가입관련매핑(registerUser-> registerUserChk)

 

회원가입을 위해 필요한메서드

(아이디자동생성을위해 student, professor에 대해 각각 다른 메서드사용)

	public String IdChk(String a) { 
    //교수: p+3자리숫자 , 학생:s+5자리숫자
		String num = null;
		if(a.equals("pro")) {
			num = createProfessorId();	
		}
		else if(a.equals("stu")) {
			num = createStudentId();
		}
		
		return num;
	
	}
	
	//교수의아이디를 자동생성하는 메서드(p000)
	private String createProfessorId() {
		int[] num = {0,1,2,3,4,5,6,7,8,9}; 
		
		String sNum="";
		for(int i=0;i<3;i++) {
			//0 ~ (num.length-1)의 랜덤한숫자반환
			int ranNum = new Random().nextInt(num.length);
			sNum+=num[ranNum]; //랜덤한 3개의숫자
		}
		ProfessorDao dao = new ProfessorDao();
		
		while(true) { 
			if(dao.idchk("p"+sNum)) { //true(id가존재하지않을 시 )면 루프탈출
				break;
			}
			else {
				int iNum = Integer.parseInt(sNum);//sNum을 Integer로형변환 
				iNum +=1; // 1 증가
				sNum = String.valueOf(iNum); // sNum으로 다시넣기
			}
		}
		//p0000 형식
		return "p"+sNum;
		
	}
	//학생의아이디를 자동생성하는 메서드(s00000)
	private String createStudentId() {
		int[] num = {0,1,2,3,4,5,6,7,8,9};
		String sNum="";
		
		for(int i=0;i<5;i++) {
			//0 ~ (num.length-1)의 랜덤한숫자반환
			int ranNum = new Random().nextInt(num.length);
			sNum+=num[ranNum]; //랜덤한 5개의숫자
		}
		StudentDao memberDao = new StudentDao();
		
		while(true) { 
			if(memberDao.idchk("s"+sNum)) { //true(id가존재하지않을 시 )면 루프탈출
				break;
			}
			else {
				int iNum = Integer.parseInt(sNum);//sNum을 Integer로형변환 
				iNum +=1; // 1 증가
				sNum = String.valueOf(iNum); // sNum으로 다시넣기
			}
		}
		
		return "s"+sNum;
	}

 

 

mypageController.java

(현재는 hashpassword와 비밀번호,이메일검증 등을 빼놨음추후에 풀어놓을것임)

	@RequestMapping("registerUserChk")
	public String  registerUser(HttpServletRequest request , HttpServletResponse response) throws ParseException {
		
		String name  = request.getParameter("name");
		String date = request.getParameter("birth");
		String pass = request.getParameter("password");
		String hashpw = BCrypt.hashpw(pass, BCrypt.gensalt());//hashPassword : 암호화 (복호화는불가능)
		String position = request.getParameter("position");
		String img = request.getParameter("picture");
		String major = request.getParameter("major");
		String email = request.getParameter("email");
		String tel = request.getParameter("tel");
		String id = IdChk(position);//직급에따른 아이디부여해주는 메서드
		System.out.println("name:"+name);
		System.out.println("date : "+date);
		System.out.println("pass : "+pass);
		System.out.println("hashpw : "+hashpw);
		System.out.println("id : "+id);
		System.out.println("major : "+major);
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	    Date birthDate = sdf.parse(date); // "YYYY-MM-dd" 형식의 문자열을 Date로 파싱
	    
	    DeptDao deptDao = new DeptDao();//DeptDao를이용해 name을 넣어 id를 꺼내 저장
	    String deptId = deptDao.selectId(major);
	    
	    String msg = name+"님 회원가입성공 id = "+id;
	    String url = "doLogin";
	    
	  //객체에 값 넣어주는과정 (교수 , 학생 따로)
	    //직급 = 교수일경우
		if(id.contains("p")) {
			Professor pro = new Professor();
			pro.setProfessorId(id);
			pro.setProfessorImg(img);
			pro.setProfessorName(name);
			pro.setProfessorBirthday(birthDate);
			pro.setProfessorEmail(email);
			//pro.setProfessorPassword(hashpw);
			pro.setProfessorPassword(pass);
			pro.setProfessorMajor(deptId);
			pro.setProfessorPhone(tel);
			ProfessorDao pDao = new ProfessorDao();
			if(!pDao.insert(pro)) {
				msg = "회원가입실패";
				url = "registerUser";
			}	
		}
		
		//학생일경우
		else {
			Student stu = new Student();
		    stu.setStudentId(id);
		    stu.setStudentNum(id.substring(1));
		    stu.setDeptId(deptId);
		    stu.setStudentName(name);
		    stu.setStudentBirthday(birthDate);
		    stu.setStudentEmail(email);
		    stu.setStudentImg(img);
		    //stu.setStudentPassword(hashpw);
		    stu.setStudentPassword(pass);
		    stu.setStudentPhone(deptId);
		    stu.setStudentPhone(tel);
		    stu.setStudentStatus("재학");
		    
		    StudentDao sDao = new StudentDao();
		    if(!sDao.insert(stu)) {
		    	msg = "회원가입실패";
				url = "registerUser";
		    }  
		}
		
		
		request.setAttribute("msg", msg);
		request.setAttribute("url", url);
		return "alert";
	}

 

StudentDao 의 일부분

(insert메서드 부분) 

//registerUser매핑부분에서 호출하는곳(회원가입)
	public boolean insert(Student stu) {
		SqlSession connection = MyBatisConnection.getConnection();
		try {
			if(connection.insert("student.insert",stu)>0) {
				return true;
			}
			else {
				return false;
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		finally {
			MyBatisConnection.close(connection);
		}
		return false;
	}

 

ProfessorDao의 일부분 

	public boolean insert(Professor pro) {
		SqlSession connection = MyBatisConnection.getConnection();
		try {
			if(connection.insert("professor.insert",pro)>0) {
				return true;
			}
			else {
				return false;
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		finally {
			MyBatisConnection.close(connection);
		}
		return false;

	}

 

 

StudentMapper.xml 의 일부분이다 (insert 부분)

ProfessorMapper.xml도 다음과같은느낌이라 생략

<insert id="insert" parameterType="Student">
    INSERT INTO student (
        student_id,student_num,dept_id,
        student_name,student_birthday,student_email,
        student_img,student_password,student_phone,
        student_status
    ) VALUES (
        #{studentId},#{studentNum},#{deptId},
        #{studentName},#{studentBirthday},#{studentEmail},
        #{studentImg},#{studentPassword},#{studentPhone},
        #{studentStatus}
    )
</insert>

 

첨부사진

 

교수로체크됐으므로 p+(3자리숫자) 로 아이디가만들어진것을확인


2) 로그인 , 로그아웃 , index(메인화면) 연결

 

(DTO를 하나만들어 professor,student검증을 한번에 진행하는걸로 바꿀거임)

	@RequestMapping("login")
	public String login(HttpServletRequest request, HttpServletResponse response) throws IOException {
		HttpSession session = request.getSession(); 
		//session정보를 얻음(session영역 속성 등록을위해)

		String id = request.getParameter("id");
		String pass = request.getParameter("pass");

		if(id==null || id.trim()=="" || pass==null || pass.trim()=="") {
			request.setAttribute("msg", "아이디or비번확인");
			request.setAttribute("url","doLogin");
			return "alert";
		}
		
		if(id.substring(0,1).equals("p")) {//첫번째문자가 p냐??(교수)
			Professor pro = new ProfessorDao().selectOne(id);
			if(pro==null){
				request.setAttribute("msg", "교수아이디를 확인하세요");
				request.setAttribute("url","doLogin");
			}

			else{
				//요청받은 비밀번호와 DB의 비밀번호비교
				if(pass.equals(pro.getProfessorPassword())
					//BCrypt.checkpw(pass, pro.getProfessorPassword())
						){//로그인성공
					session.setAttribute("login", id);
					request.setAttribute("msg", pro.getProfessorName()+"님이 로그인 하셨습니다");
					request.setAttribute("url","index");

				}
				else{
					request.setAttribute("msg", "비번을 확인하세요");
					request.setAttribute("url","doLogin");
				}
			}
			
		}
		
		else if(id.substring(0,1).equals("s")) { //첫번째문자가 s냐??(학생)
			Student stu = new StudentDao().selectOne(id);
			System.out.println(stu);
			
			if(stu==null){
				request.setAttribute("msg", "학생아이디를 확인하세요");
				request.setAttribute("url","doLogin");
			}

			else{
				//요청받은 비밀번호와 DB의 비밀번호비교
				if(pass.equals(stu.getStudentPassword())){//로그인성공
					System.out.println("학생로그인");
					session.setAttribute("login", id);
					request.setAttribute("msg", stu.getStudentName()+"님이 로그인 하셨습니다");
					request.setAttribute("url","index");
					//return "index";

				}
				else{
					request.setAttribute("msg", "비번을 확인하세요");
					request.setAttribute("url","doLogin");
				}
			}
			
		}
		else {
			System.out.println("뭐야?");
			request.setAttribute("msg", "아이디를 확인하세요");
			request.setAttribute("url","doLogin");
		}
		return "alert";
	}
	
	@RequestMapping("index") //왜이렇게해야지만 index로가는거지??????
	public String main(HttpServletRequest request , HttpServletResponse response) {

		String login = (String)request.getSession().getAttribute("login");
		if(login==null || login.trim().equals("")) {
			request.setAttribute("msg", "로그인하세요");
			request.setAttribute("url","doLogin");
			return "alert";
		}
		return "index"; //forward 됨
		//redirect시 다른 request영역이므로 속성이 넘어가지않음

	}
	
	@RequestMapping("logout")
	public String logout(HttpServletRequest request, HttpServletResponse response) {
		request.getSession().invalidate();
		return "redirect:doLogin"; //redirect하도록 설정(속성초기화)
	}

여기서 빡치는점은 index를 url속성으로지정해서 넘기면 돌아가지않는다는 점

그래서 index매핑을 하나 만들어준 후 로그인검증을 하고 return  "index" 해주는방식을 사용함

(로그인시 session으로 넘어온 id로 검증)

 

 

현재까지만든  회원가입,사진등록,index부분은 layout이필요없으므로 제외시켰음

 

SiteMeshFilter.java

package sitemesh;

import javax.servlet.annotation.WebFilter;

import org.sitemesh.builder.SiteMeshFilterBuilder;
import org.sitemesh.config.ConfigurableSiteMeshFilter;

/*
 * 1. sitemesh 패키지 생성
 * 2. SiteMeshFilter 클래스 파일생성
 * 
 * sitemesh 기능 : 화면 layout 페이지를 구현하여 jsp 페이지를 적용하는 프레임워크
 * 
 * filter 기능 : servlet 이전에 먼저 실행하여 request나 response 객체를 변경할 수 있는 기능
 */

@WebFilter("/*") // url mapping /* => 모든 요청시 필터 적용
public class SiteMeshFilter extends ConfigurableSiteMeshFilter{

	@Override
	protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) {
		// layout 페이지의 위치정보 설정
		// /member/* => http://localhost:8080/model1Study/member/ 이하 모든 요청시
		// /layout/layout.jsp 페이지를 layout 페이지로 설정
		builder.addDecoratorPath("/learning_support/*", "/dist/pages/layout.jsp")
				.addExcludedPath("/learning_support/colleges*")
				.addExcludedPath("/learning_support/departments*")
				.addExcludedPath("/learning_support/searchCourse*")
				.addExcludedPath("/learning_support/addCourse*")
				.addExcludedPath("/learning_support/searchRegistrationCourses*")
				.addExcludedPath("/learning_support/deleteCourse*")
				.addExcludedPath("/mypage/index*")
				.addExcludedPath("/mypage/registerUser*")
				.addExcludedPath("/mypage/registerImg*");

				
		builder.addDecoratorPath("/post/*","/dist/pages/layout.jsp");
		builder.addDecoratorPath("/mypage/*","/dist/pages/layout.jsp");
		
	}
	
	

}

 

또한 index.jsp파일의 모든경로들을 절대경로

<c:set var="path" value="${pageContext.request.contextPath}" scope="application"/>

로 변경해줬음 (아니면 사진이 깨지거나함)

 

 

doLogin은 layout을 적용해서 다음과같이 사진도넣어서 대학분위기가 나게끔 해봄

 

 


 index.jsp(메인) 의 우측상단작업 및 절대경로변환

 

변경된부분

<li class="nav-item dropdown user-menu"><a href="#"
	class="nav-link dropdown-toggle" data-bs-toggle="dropdown"> <img
src="${path}/dist/assets/img/user2-160x160.jpg"
class="user-image rounded-circle shadow" alt="User Image" />
<span class="d-none d-md-inline" style="font-size: 20px">${sessionScope.login}</span>

 

다음과같이 아이디가 우측상단에 뜨게끔 해놈

(사진은 추후에 할거임 아마 request로받아야하지않을까?)

sign out을 누르면 session에 속성이날라감(login정보날라감)

그후 doLogin으로 이동