스프링으로 로그인, 로그아웃
- 로그인 정보를 내가 직접 등록하지 않고 Dispatcher Servlet이 알아서 Session영역에 등록하게 할 수 있게 된다.
@SessionAttributes({"userVO"})
: userVO라는 이름의 객체는 Session 공유영역에 올려라. ( 하나일땐 문자열로 표현 가능 )
model.addAtribute("userVO", userVO);
가 가능해짐.
- 그러나 로그아웃 시
session.invalidate();
를 사용할 수 없다.
SessionStatus sessionStatus
의 setComplete()
를 사용하여 삭제한다.
@GetMapping("/logout")
public String logout(SessionStatus sessionStatus) {
System.out.println(sessionStatus.isComplete());//false
sessionStatus.setComplete(); // session영역의 객체 삭제 (@SessionAttributes쓸때만 사용가능)
System.out.println(sessionStatus.isComplete()); // true
return "redirect:/";
}
로그인여부를 판단해서 기능 제한하기 ( 인터셉터 )
- 매번 페이지 들어갈때마다 로그인여부를 판단하는 것은 비효율적
- Interceptor를 만들어서 로그인 여부 판단후 선택한 페이지로 가도록 만들 수 있다.
1. LoginInterceptor
package kr.ac.kopo.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import kr.ac.kopo.member.vo.MemberVO;
public class LoginInterceptor extends HandlerInterceptorAdapter{
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
//로그인 여부 판단
HttpSession session = request.getSession();
MemberVO userVO = (MemberVO)session.getAttribute("userVO");
if(userVO == null) {
//response.sendRedirect(request.getContextPath()+"/login");//이러면 메인페이지로 감.
//목적지의 경로를 기억시킨다.
String uri = request.getRequestURI();
uri = uri.substring(request.getContextPath().length());
/* /board/3은 가능하지만 /board?no=3은 못가져옴
String query = request.getQueryString(); // /board?no=3을 가져올 수 있다.
if(query!=null) {
uri = uri + "?" + query;
}
*/
//System.out.println("uri : " + uri); // /board/3
//session영역에 저장
session.setAttribute("dest", uri);
return false;
}
return true;
}
}
2. spring-mvc.xml 설정하기
- 원하는 경로에 들어갔을 때 작동하게 설정할 수 있다.
<bean class="kr.ac.kopo.interceptor.LoginInterceptor" id="loginInterceptor" />
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/login" />
<mvc:exclude-mapping path="/resources/**" />
<mvc:exclude-mapping path="/" />
<mvc:exclude-mapping path="/board" />
<ref bean="loginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
3. Controller에 설정하기
@PostMapping("/login")
public String login(MemberVO member, Model model, HttpSession session) {
//id와 pw가 날라오면 기억할것
MemberVO userVO = memberService.login(member);
String msg="";
if(userVO == null) {
// 로그인 실패시
msg="아이디 또는 패스워드가 잘못되었습니다.";
model.addAttribute("msg", msg);
return "login/login";
}
// 로그인 성공
model.addAttribute("userVO", userVO);
//인터셉트로 가져옴
String dest = (String)session.getAttribute("dest");
if(dest != null) {
session.removeAttribute("dest");
return "redirect:/" + dest;
}
return "redirect:/";
}