반응형
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으로 이동
'프로젝트' 카테고리의 다른 글
프로젝트중간 (개인정보(userInfo) 내용들 , index매핑과정 controller변경) (0) | 2025.05.14 |
---|---|
프로젝트진행중 ( 로그인시 index에 정보몇개전달 , id/pw찾기) (0) | 2025.05.13 |
주말에 프로젝트조금해보기(회원가입만 해보자...!) (1) | 2025.05.10 |
세미프로젝트 (로그인폼) (0) | 2025.05.09 |
Hashpass , UUID (0) | 2025.05.09 |