index.jsp 의 body 내부에
<%=request.getHeader("User-Agent") %> 입력
클라이언트가 접속하면 그 정보를 가져온다 (사용자 정보 읽기)
요런식으로 브라우저 정보까지 같이 뜬다
암튼 이제 게시판 CRUD 완료!
Create, Read, Update, Delete
오늘 할일은
> 로그인
> 보드+ 멤버테이블 연동
HeidiSQL 에서
+ 신규=> '구로서버' 로 이름바꿔주기
새로운 ip주소에 id & pw 만들어주셨당
위 캡쳐에서 체크부분 삼각형 클릭해서 세개 뜨는지 확인하고
열기 & 저장
요렇게 생성되는데 표시된 schema 부분은 절대 수정하지 말기 절대절대 ****
요렇게 들어있고 내꺼에는 채워줘야지 이제부터
일단 패스워드 먼저 바꾸자
SET PASSWORD FOR '(아이디)'@'%'=PASSWORD('비밀번호')
( % 는 외부에서 내꺼로 들어올 때 )
-- 아이디@localhost 요런 형태로 들어감
내가 바꿀 패스워드 입력하고 f9 실행은 한번만 ***
db 관리자는 위의 쿼리문으로 암호들을 바꿨는지 확인 가능 (암호화 기법중 SHA 정처기!!!!!!!!!!!!)
아래 체크부분 연결끊고, 내가 설정한 비번으로 로그인 되는지 확인~
내 db (마우스 우클릭) - 새로생성 - 테이블 선택
member_no => m_no 로 표기해줄거 (사용자번호)
int타입이고, pk는 중복되면 안되니 자동증가로 설정, null 해제
m_no / m_id / m_pw / m_name / m_joindate / m_addr / m_grade 필드 추가추가
가입하자마자 등급은 5로 지정 & 날짜 자동생성
no, joindate, grade 제외한 나머지는 입력필요
id는 고유해야 하니, 마우스 우클릭 - 새 인덱스 생성 - UNIQUE
no는 기본키로 설정, 마우스 우클릭 - 새 인덱스 생성 - PRIMARY
저장하면 내가 입력한 값들은 CREATE 코드에 만들어진거 확인가능
데이터들을 저장해보자 (필드에 속성 채우기)
INSERT INTO member (m_id, m_pw, m_name, m_addr)
VALUES('PYO', '01234567', 'PHYHO', '구로구 구로동'); _ 쉼표 이용해서 일괄입력, 스트링은 따옴표가 하나**
MEMBER 는 예약어라 소문자 member 해줘야함**
데이터에 내가 입력한(id, name, addr) 생성됨 (no, joindate, grade 는 자동생성)
member 에서 마우스 우클릭 - 편집 - 기본탭에서 이름 바꿔줌 __ members로
다른 데이터들도 추가해주자
(데이터 만들기 완) _ 9번은 관리자, 1번은 자격정지, 0번은 탈퇴
만약에 여기에서 2번 데이터를 지우면 다시 되살릴수 없음, 다음 번호부터 생성됨.
(등급이 5일 사람만 골라보기)
CREATE * mambers
WHERE m_grade=5;
원하는 정보만 뽑아내서 VIEW 생성
CREATE VIEW mambersview AS
SELECT m_id, m_pw, m_no m_name FROM members WHERE m_grade=5;
다시 스프링가서 새로운 아이디랑 비번 입력
요거는 절대절대 깃허브에 올리면 안되!!!!!!!!!!!!!!!!!!
database-context.xml 파일 두개는 빼고 올리기 꼭꼭빼기!!!!!!!!!!!!!!!!!!!!
java파일이랑 jsp 랑 mapper 만 올리기 (클래스파일은 노필요)
암튼 데이터베이스가 변경되었으니 board는 모두 에러!!!!!!!!!!!!!!!!!!!
로그인 컨트롤러 만들자
LoginController.java 생성
void 해도 상관은 없음 일단 String으로 만들기
로그인 버튼 누르면 내가 입력한 id&pw는 콘솔창에 뜨고 페이지는 index로 이동함!
LoginDTO.java 생성
새로운 DB 변수 선언 & Getter/Setter 만들기
로그인 DTO 객체 생성
loginService.java 에게 dto를 보내서 login() 메소드로 일을 시킬건데 아직 서비스가 없어
loginService.java 클래스 생성
@Service 선언
컨트롤러랑 서비스 연결 & dto한테 login() 메소드 일시켜
name을 가져와서 (name)님 반갑습니다 를 띄울건데
만약에 로그인 안한 상태라면 db에서의 name값이 null이라면...? (db에서의 null과 자바에서의 null이 다름*)
name은 dto에 있지만 count는 없으니 얘도 그냥 추가해주는게 나음
BoardDTO에 int타입으로 count 추가해주고 getter/setter 만들어주기
이제 컨트롤러에서 서비스에게 일을 시킬 login() 메소드를 서비스에 생성
(컨트롤러에서 밑줄로 create 하기)
LoginDAO 생성
> @Repository 선언
> @Autowired 선언 (sql문 실행시키도록 연결)
서비스에서 @Autowired 로 DAO랑 연결
dto를 가지고 login() 실행시키라고 DAO한테 일을 시켜
BoardDAO 에 login() 메소드 만들자
selectOne () 메소드로 가져올거 (한줄 가져올거니까)
이제 login.login 이 있는 login-mapper를 만들자
이전에 만들었던 board-mapper 복사해서 붙여넣기로
login-mapper인 xml파일 만들자
<mapper namespace="login"> => 요렇게 바꿔주고
parameterType 은 들어오는 타입
resultType 은 나가는 타입 (받아온 정보를 디비와 비교해서 name, count값을 내보내야 하니 얘도 지정해줘야함)
mybatisConfig.xml 에
제대로 연결이 되었다면 "com.phyho.pro1.LoginDTO" 클릭했을때 LoginDTO로 연결됨!!!!!
name이랑 count 같이 가져오는 sql 명령문
SELECT m_name, count(*) FROM membersview WHERE m_id='porbi' AND m_pw='01234567';
있으면 제대로 불러오고 없으면 name 은 null로 count는 0으로 불러와진다
db에서 쿼리문 잘 실행되는거 확인했으니,
login-mapper에 이 쿼리문 작성. (입력한 id&pw에 해당하는 name, count 값 가져와라 )
dto에 값을 보내서 처리 후에 받아온 값이 result (타입은 dto)
받아온 result에서 내가 필요한 값인 name이랑 count를 출력해보자 (애초에 필요한 값만 result에 받음)
db에 저장되어 있는 id & pw 입력해서 로그인 해보면
콘솔창에 해당 id & pw에 해당하는 정보가 아래처럼 뜬다
뽀로로 __ (name)
1 __ (count값)
이제 잘 연결되는거 확인했으니 진짜 로그인 해보자 (콘솔 출력문은 주석처리 해주고)
if 조건문 (가져온 count 값이 1이라면 = 즉, 입력한 id&pw 와 일치하는 값이 db에 있다면_로그인성공)
index 페이지 (메인페이지) 로 이동.
아니라면 (로그인 실패) 다시 로그인페이지로 이동.
db에 없는 계정인 banana로 로그인 해보면
다시 로그인 페이지로 돌아옴
HttpSession session = request.getSession();
session을 만들어서 여기에 담을건데 이건 그냥 외워_ getSession() 메소드를 사용해 session에 값을 담음
result의 name값을 "mname" 이라는 이름으로 가져와서 세션에 저장해
session은 서버에 저장됨 (브라우저당 하나씩_ 크롬용, 엣지용, 웨일용 요런식으로 다른 session이 된다)
쿠키는 클라이언트(사용자 컴퓨터에) 저장되기 때문에 객체저장 안됨, 보안에 취약
menu.jsp에서 이 session을 불러와보자
li 추가하고 (메뉴바 우측에 뜨도록 설정)
sessionScope.mname 로 불러올 수 있음
(세션에 담긴 값을 불러오려면 sessionScope 사용, mname으로 세션에 담았으니 이 이름으로 불러옴 )
pororo / ********(pw) 로 로그인 해보면
db에 저장된 이름인 뽀로로가 불러와져서 아래처럼 출력
(name) 님 반갑습니다.
id도 가져와서 session에 넣어보자
여기서 name은 result에서 가져왔고 (board-mapper 파일에 작성된 쿼리문보면 name, count 값만 가져왔었음)
id는 dto에서 가져와야함.
정리해보자면 dto에 id랑 pw를 담아 보냈고, 컨트롤러-서비스-DAO를 지나서 db에 전달.
db에서 해당 id & pw에 해당하는 name이랑 count를(필요한 정보) dto에 담아 가져와서 result에 담았음!!
result 에는 결국 name, count가 있고,
result는 dto를 가지고 있으나 일단 id & pw 값은 result에는 없으니 dto에서 .getM_id() 로 불러옴
(mid라는 이름으로 세션에 넣어줌)
result 말고 그냥 dto에서 필요한 값들을 가져온다면
서비스에서 받은 필요값(name, count)을 컨트롤러의 dto라는 변수에 담고,
ID는 위에서 사용했던 request.getParameter("ID")를 그대로 가져와서 사용
(얘가 일단은 보낼때의ID값을 가지고 있다고한다)
~님 반갑습니다 옆에 id 뜨도록 li 추가해주고
db정보에 있는 id & pw로 로그인 해보면
아래처럼 출력된다.
(name) 반갑습니다 ( id )
이제 로그아웃 버튼을 만들어보자
입력한 id & pw가 유효하다면(db에 해당 id & pw가 있다면) 로그인되면서 '반갑습니다~' 뜨는데
그렇게 로그인 성공한 페이지에는 로그아웃 버튼이 보이도록 만들자
menu.jsp 파일에
코어태그 선언하고 조건문 사용.
<c:choose> ~
<c:when> ( if ~ ) => mname값이 null이라면 (입력 id & pw와 일치하는 값이 db에 없다면)
다시 로그인페이지로 이동
<c:otherwise> ~ ( else ~ ) => mname값이 있다면 (입력 id & pw와 일치하는 값이 db에 있다면)
'(name) & (id) 님 반갑습니다' 문구 출력 하고
로그아웃 버튼 나타남 (클릭하면 logout 페이지로 가는 onclick 기능도 추가)
* test : 필수속성으로 EL비교식을 값으로 가짐.
* eq : 문자열 또는 숫자가 같으면 참, null 또는 빈 문자열인지 확인 가능
LoginController.java 에서 logout 버튼 실행시켜보자
@GetMapping으로 logout이랑 연결해주고
로그아웃 버튼을 눌렀을때 ( onclick() 이 실행되면 )
(방법1)
session에 담긴 mname 과 mid가 null이 아니라면 ( 로그인 성공했으니 mname & mid는 session에 담겨있음 )
.removeAttribute() 메소드로 session삭제하고
.setMaxInactiveInterval(0) 메소드로 세션을 무효화 (시간은 0으로 줘서 곧바로 타임아웃 시킴) ****
index 페이지로(메인페이지) 이동
(방법2)
.invalidate() 메소드 사용해서 세션 객체 자체를 삭제
'국비과정 > Spring' 카테고리의 다른 글
20230725 _[37일차]_01. Spring 게시판 글수정제한 (로그인) (0) | 2023.07.26 |
---|---|
20230724 _[36일차]_01. Spring 게시판 글쓰기제한 (로그인) (0) | 2023.07.24 |
20230720 _[34일차]_01. Spring 게시판 수정기능 + 로그인페이지 (0) | 2023.07.20 |
20230719 _[33일차]_01. Spring 게시판 수정 & 삭제 버튼 생성 (0) | 2023.07.19 |
20230718 _[32일차]_01. Spring 게시판 글쓰기 기능 (0) | 2023.07.18 |