회원가입 하고 로그인을 했으면 이제 로그아웃도 해야지.
index.jsp에서 logout 기능을 해줄 a태그를 먼저 설정을 해주었다.
index.jsp
<body>
// ... (기존 코드 )
<header>
<div>Logo</div>
<div>
<ul>
<li><a href="/index.jsp">HOME</a></li>
<c:if test="${ses.id eq null }">
<li><a href="/member/login.jsp">LOGIN</a></li>
<li><a href="/memb/join">SIGNUP</a></li>
</c:if>
<c:if test="${ses.id ne null }">
<li><a href="#">BOARD</a></li>
<li><a href="#">MYPAGE</a></li>
<li><a href="/memb/logout">LOGOUT</a></li>
</c:if>
</ul>
</div>
</header>
<main></main>
<footer></footer>
// ... (기존 코드)
</body>
</html>
MemberController에서 case에 logout을 추가해서 관련 코드를 작성한다.
MemberController.java
package controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import domain.MemberVO;
import service.MemberService;
import service.MemberServiceImpl;
@WebServlet("/memb/*")
public class MemberController extends HttpServlet {
// ... (기존 코드)
case "logout":
try {
// 로그인 정보
HttpSession ses = request.getSession();
// ses에서 mvo 객체로 가져오기
// lastLogin update할 때 id 가져오려고 만듦
MemberVO mvo = (MemberVO)ses.getAttribute("ses");
log.info(">>> ses mvo >>> {}",mvo);
// lastLogin update
isOk = msv.lastLogin(mvo.getId());
log.info("lastLogin >>> ", (isOk > 0) ? "OK" : "FAIL");
// 세션 무효화 (세션 끊기)
ses.invalidate();
destPage = "/index.jsp";
} catch (Exception e) {
e.printStackTrace();
log.info(">>> logout error");
}
break;
}
// ... (기존 코드)
}
msv.lastLogin 부분을 타고 service / serviceImpl / DAO / DAOImpl / mapper까지
순차적으로 코드를 작성한다.
(controller > service > serviceImpl > DAO > DAOImpl> mapper는 앞으로도 계속 반복되는 순서라
설명이 필요한 부분을 제외하고는 더 이상 별도의 언급없이 바로 코드블럭으로 진행)
MemberService.interface
package service;
import domain.MemberVO;
public interface MemberService {
int register(MemberVO mvo);
MemberVO login(MemberVO mvo);
int lastLogin(String id);
}
MemberServiceImpl.java
package service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import domain.MemberVO;
import repository.MemberDAO;
import repository.MemberDAOImpl;
public class MemberServiceImpl implements MemberService {
// ... ( 기존 코드)
@Override
public int lastLogin(String id) {
log.info(">>> lastLogin check 2");
return mdao.lastLogin(id);
}
}
MemberDAO.interface
package repository;
import domain.MemberVO;
public interface MemberDAO {
int insert(MemberVO mvo);
MemberVO login(MemberVO mvo);
int lastLogin(String id);
}
MemberDAOImpl.java
package repository;
import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import domain.MemberVO;
import orm.DatabaseBuilder;
public class MemberDAOImpl implements MemberDAO {
// ... (기존 코드)
@Override
public int lastLogin(String id) {
log.info(">>> lastLogin check 3");
int isOk = sql.update("MemberMapper.last", id);
if (isOk > 0) sql.commit();
return isOk;
}
}
memberMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="MemberMapper">
<insert id="reg">
insert into member(id, pwd, email, team)
values(#{id}, #{pwd}, #{email}, #{team})
</insert>
<select id="login" resultType="mvo">
select * from member
where id = #{id} and pwd = #{pwd}
</select>
<update id="last">
update member set lastlogin = now()
where id = #{id}
</update>
</mapper>
로그인과 로그아웃에 따른 화면 변화는 https://rlog0918.tistory.com/178 여기 화면과 같으므로
별도로 첨부하지 않고 여기서 마무리하려고 했으나, 이렇게 끝나면 또 뭔가 섭섭..
차별점을 무엇을 줄까 하다가, index.jsp main에 '[id]님, 환영합니다.' 와, 최근 접속일을 출력하기로 했다.
index.jsp
// ... (기존 코드)
<body>
<header>
// ... (기존 코드)
</header>
<main>
<c:if test="${ses.id ne null }">
<div>
[ ${ses.id } ]님 환영합니다.<br>
최근 접속일 : ${ses.lastlogin }
</div>
</c:if>
</main>
<footer></footer>
// ... (기존 코드)
lastLogin이 DB에 연동이 안되는데 화면에는 연동된 것처럼 들 수도 있으니,
DB확인도 꼭 해주어야 한다.
lastLogin은 로그아웃 버튼을 눌렀을 때 업데이트 되므로, 다시 재로그인 할 때 확인해야한다.
로그인 전
로그인
로그아웃
[JSP/Servlet] 4. 로그아웃
(다음 게시물 예고편)
[JSP/Servlet] 5. 마이페이지와 수정
얼렁뚱땅 주니어 개발자
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!