로그인 화면 jsp 파일 쪽에서
자동 로그인 체크 여부를 가져온후 객체 리터럴 방식으로 id,pw,autoLogin 정보를 담아줍니다.
//로그인 요청 처리
@PostMapping("/loginCheck")
public String login(@RequestBody UserVO vo,
/*HttpServletRequest request*/HttpServletResponse response,
HttpSession session) {
System.out.println("/user/loginCheck: POST");
System.out.println("param:" + vo);
//서버에서 세션 객체를 얻는 방법
//1.HTTPservletRequest 객체 사용
// HttpSession session = request.getSession();
//2.매개값으로 HttpSession 객체 받아서 사용
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
UserVO dbData = service.selectOne(vo.getAccount());
//Mybatis는 조회된 값이없으면 null 이온다.
if(dbData != null) { //raw 비밀번호랑 비교한다; 암호화된것이랑.
if(encoder.matches(vo.getPassword(),dbData.getPassword())) {
//로그인 성공 회원을 대상으로 세션 정보를 생성.
session.setAttribute("login", dbData);
long limitTime = 60 * 60 * 24 * 90;
//자동 로그인 체크 시 처리해야 할 내용
if(vo.isAutoLogin()) {
//자동 로그인을 희망하는 경우
//쿠키를 이용하여 자동 로그인 정보를 저장.
System.out.println("자동 로그인 쿠키 생성 중...");
//세션 아이디를 가지고 와서 쿠키에 저장(고유한 값이 필요합니다)
Cookie loginCookie = new Cookie("loginCookie",session.getId());
loginCookie.setPath("/"); //쿠키가 동작할 수 있는 유효한 url
loginCookie.setMaxAge((int)limitTime);
response.addCookie(loginCookie);
//자동 로그인 유지 시간을 날짜 객체로 변환.(DB에 삽입하기 위해, 밀리초.)
long expiredDate = System.currentTimeMillis() + (limitTime * 1000);
//Date 객체의 생성자에 매개값으로 밀리초의 정수를 전달하면 날짜형태로 변경해 줍니다.
Date date = new Date(expiredDate);
System.out.println("자동 로그인 만료시간:" + date);
service.keepLogin(session.getId(), date, vo.getAccount());
}
return "loginSuccess";
} else {
return "pwFail";
}
} else {
return "idFail";
}
에서 autoLogin이 체크되어있을 경우 Cookie를 생성합니다.
Cookie loginCookie = new Cookie("loginCookie",session.getId());
loginCookie.setPath("/"); //쿠키가 동작할 수 있는 유효한 url
loginCookie.setMaxAge((int)limitTime);
response.addCookie(loginCookie);
인터셉터의 preHandel() 을 이용하여 loginCookie가 있는지 확인합니다.
//원하는 쿠키의 값을 한방에 꺼내오실 수 있습니다.(request객체, 쿠키이름)
Cookie loginCookie = WebUtils.getCookie(request, "loginCookie");
//자동 로그인 신청한 사람이라면 로그인 유지를 위해 세션 데이터를 만들어 줘야함.
HttpSession session = request.getSession();
if(loginCookie != null) { //자동로그인을 이전에 신청한 유저구나.
// 2.DB에서 쿠키값(세션ID)와 일치하는 세션ID를 가진 회원의 정보를 조회
UserVO vo = mapper.getUserWithSessionId(loginCookie.getValue());
System.out.println("쿠키의 값:" + loginCookie.getValue());
System.out.println("DB에서 가져온값:" + vo);
if(vo != null) {
//자동 로그인 신청한 사람의 로그인 데이터(세션)을 만들어 줍시다.
session.setAttribute("login", vo);
System.out.println("세션 제작 완료");
}
}
//true 이면 컨트롤러로 요청이 들어가고, false 면 요청을 막습니다.
//자동 로그인 신청 여부와 상관없이 홈 화면은 무조건 봐야 하니까 true를 작성.
return true;
이런식으로 작성합니다.
하지만 로그아웃 버튼을 클릭하여도 로그인이 유지가 되는데 이런 경우에는 자동 로그인 쿠키가 있는지 확인하여 쿠키가 존재한다면 수명을 0, DB를 조작해주어야 합니다. 만료시간 : new Date().
Cookie loginCookie = WebUtils.getCookie(request, "loginCookie");
if(loginCookie != null) {
loginCookie.setMaxAge(0);
loginCookie.setPath("/");
response.addCookie(loginCookie); //쿠키는 클라이언트 쪽에
service.keepLogin("none", new Date(), user.getAccount());
}
//자동 로그인 해제 방법.