Spring09_로그인, 로그아웃 구현

1 minute read



스프링으로 로그인, 로그아웃

  • 로그인 정보를 내가 직접 등록하지 않고 Dispatcher Servlet이 알아서 Session영역에 등록하게 할 수 있게 된다.
  • @SessionAttributes({"userVO"}) : userVO라는 이름의 객체는 Session 공유영역에 올려라. ( 하나일땐 문자열로 표현 가능 )
    • model.addAtribute("userVO", userVO); 가 가능해짐.
    • 그러나 로그아웃 시 session.invalidate(); 를 사용할 수 없다.
      • SessionStatus sessionStatussetComplete()를 사용하여 삭제한다.
@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:/";			
}