Interceptor
웹 애플리케이션에서 요청과 응답을 가로채서 처리하는 기능을 제공하는 Spring Framework의 구성요소이다.
사전 처리 : 클라이언트의 요청이 컨트롤러에 도달하기 전 사전에 필요한 작업을 수행한다.
ex) 로그인 여부를 확인하거나 요청의 유효성을 검사하는 등의 작업을 수행한다.
사후 처리 : 컨트롤러가 요청을 처리하고 응답을 반환한 후 추가적인 작업을 수행한다.
[인터셉터 만들기]
preHandle : Controller 실행 이전에 호출 되는 메소드
postHandle : Controller 실행 이후에 호출 되는 메소드
afterCompletion : 응답된 이후에 호출 되는 메소드!
실행되는 시점
MyInterface 클래스에 호출 될 메소드를 만든다!
실행의 흐름을 확인하기 위해 콘솔에 출력되게 호출을 해주기로 했다!
놀러가기
링크를 만들어준다!Home 화면에서 놀러가기 링크를 눌러주면 ?!
preHandle() 메소드가 실행되고
console에서도 순서대로 실행되는 것을 확인 할 수 있다 !
home.jsp 페이지에서 로그인 페이지와 로그아웃 페이지/ 로그인이 필요한 개인정보 페이지의 링크를 만든다.
<c:if>
태그를 이용해서 sessionScope의 갑의 존재여부에 대한 확인 메세지를 나타내는 코드를 작성해준다.
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//세션 객체의 참조값을 얻어와서
HttpSession session=request.getSession();
String id=(String)session.getAttribute("id");
//만일 로그인을 하지 않았다면
if(id == null) {
//로그인 페이지로 리다이렉트 이동 시키고 false 를 리턴한다.
//원래 가려던 url 정보 읽어오기
String url=request.getRequestURI();
//GET 방식 전송 파라미터를 query 문자열로 읽어오기 ( a=xxx&b=xxx&c=xxx )
String query=request.getQueryString();
//특수 문자는 인코딩을 해야한다.
String encodedUrl=null;
if(query==null) {//전송 파라미터가 없다면
encodedUrl=URLEncoder.encode(url);
}else {
// 원래 목적지가 /test/xxx.jsp 라고 가정하면 아래와 같은 형식의 문자열을 만든다.
// "/test/xxx.jsp?a=xxx&b=xxx ..."
encodedUrl=URLEncoder.encode(url+"?"+query);
}
//3. 로그인을 하지 않았다면 /users/loginform.do 페이지로 리다이렉트 이동 시킨다. (HttpServletResponse)
String cPath=request.getContextPath();
response.sendRedirect(cPath+"/users/loginform?url="+encodedUrl);
return false;
}
//로그인을 했다면 흐름을 이어간다.
return true;
}
/users/*
패턴에 해당하는 URL에 인터셉터를 적용하도록 지정한다.
/users/
로 시작하는 모든 URL에 대해 인터셉터가 동작한다는 의미
<exclude-mapping>
/users/loginform
과 /users/login
패턴에 해당하는 URL은 인터셉터의 적용을 제외
로그인 폼과 로그인 처리 URL은 인터셉터의 영향을 받지 않도록 설정하는 것
<beans:ref>
요소: loginInterceptor
라는 이름의 빈을 참조하여 해당 인터셉터를 등록한다.
이 설정을 통해 /users/
로 시작하는 URL에 대해 인터셉터가 동작하도록 설정되고, 로그인 폼과 로그인 처리 URL은 인터셉터의 영향을 받지 않는다.