티스토리 뷰

리다이렉트(redirect)

리다이렉트란 컨트롤러에서 뷰를 분기하는 방법으로 사용자가 요청한 URL이 아닌 다른 URL을 넘겨주는 것이다. 

예를 들어, 회원정보수정 페이지로 접근했을 때 로그인이 되어있지 않다면 사용자를 회원정보수정페이지가 아닌 로그인 페이지로 이동(리다이렉트)시켜야한다.

 

Controller에 Redirect 구현

@RequestMapping(value = "/member/modifyForm")
public String modifyForm(Model model, HttpServletRequest request) {

    HttpSession session = request.getSession();
    Member member = (Member) session.getAttribute("member");

    if(null == member) {
        return "redirect:/member/loginForm";
    } else {
        model.addAttribute("member", service.memberSearch(member));
    }

    return "/member/modifyForm";
}

세션에서 회원정보를 가져올 때, 로그인이 되어있지 않다면 null을 반환하는데, 이를 판단해 로그인이 되어있지 않은 사용자에겐 로그인 페이지로 리다이렉트 시켜준다.

 

 

인터셉터(Interceptor)

리다이렉트 처리할 페이지가 많을 때, Controller에서 메소드 마다 처리해주기엔 프로그래머가 번거로울 수 있다. 이 때 인터셉터를 이용하면 사용자의 요청이 핸들러(컨트롤러)에 도달하기 전 원하는 작업을 지정한 후 핸들러로 보낼 수 있다. 인터셉터는 Dispatcherservlet핸들러 사이에 위치해 사용자의 요청이 핸들러에 도달하기 전 요청을 가로채 작업을 수행 한 후 핸들러로 보낼 수 있다.

 

인터셉터를 이용하게되면 처리해야 할 리다이렉트를 일일이 작성할 필요가 없어 코드량이 줄어들고, 리다이렉트 처리 누락에 대한 위험을 감소시킬 수 있다. 

 

 

인터셉터 메소드

preHandle()

  • 컨트롤러 호출 전 실행된다.
  • 리다이렉트를 대체할 수 있는 메소드이다.
  • boolean(true/false)를 반환한다 

postHandle()

  • 컨트롤러 작업 후 실행된다.
  • View생성 이전에 실행된다.
  • 인터셉터의 preHandle() 메소드가 정상종료 및 true를 반환했을 때 불러올 수 있다.
  • ModelAndView에 추가적으로 랜더링할 model 객체를 추가할 수 있다.

afterCompletion()

  • View생성 후(모든 요청 처리가 끝난 후), 응답 전에 실행된다.
  • 인터셉터의 preHandle() 메소드가 정상종료 및 true를 반환했을 때 불러올 수 있다.
  • 인터셉터가 여러개 일 경우 postHandle() 메소드는 역순으로 호출된다. (첫 번째 인터셉터가 마지막에 호출된다)

 

인터셉터 클래스 생성

public class MemberLoginInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request
                          , HttpServletResponse response
                          , Object handler) throws Exception {

        HttpSession session = request.getSession(false);
        if (session != null) {
            Object obj = session.getAttribute("member");
            if (obj != null)
                return true;
        }

        response.sendRedirect(request.getContextPath() + "/member/loginForm"); //리다이렉트 처리
        return false;
    }
}

HandlerInterceptorAdapter 클래스 상속 후 인터셉터 메소드를 구현해나간다. 먼저 세션을 가져오는데, getSession() 인자로 false를 주었기 때문에 HttpSession이 존재하지 않을 경우(로그인 상태가 아닐 때) null을 반환하게 된다.

 

세션을 가져왔을 때 null이 아니라면 로그인 상태라는 걸 뜻하므로 회원정보("member")를 추가한 후 true를 반환한다.

 

만약 세션이 null인 경우 로그인 화면으로 리다이렉트 처리를 하며 false를 반환한다.

 

postHandle 및 afterCompletion 구현

@Override
public void postHandle(HttpServletRequest request
                     , HttpServletResponse response
                     , Object handler
                     ,ModelAndView modelAndView) throws Exception {

    super.postHandle(request, response, handler, modelAndView);
}

@Override
public void afterCompletion(HttpServletRequest request
                         , HttpServletResponse response
                         , Object handler
                         , Exception ex) throws Exception {

    super.afterCompletion(request, response, handler, ex);
}

HandlerInterceptorAdapter 를 상속 했기 때문에 다른 인터셉터 메소드 또한 구현 가능하다. 

 

 

스프링 설정파일 - 인터셉터 경로 설정 

servlet-context.xml

<interceptors>
    <interceptor>
        <mapping path="/member/modifyForm"/>
        <mapping path="/member/removeForm"/>
        <beans:bean class="com.bs.lec21.member.MemberLoginInterceptor"/>
    </interceptor>
</interceptors>

인터셉터 Bean을 등록해준 뒤 인터셉터를 적용 할 URL을 지정해준다. 

 

servlet-context.xml

<interceptors>
    <interceptor>
        <mapping path="/member/**"/>
        <exclude-mapping path="/member/joinForm"/>
        <exclude-mapping path="/member/join"/>
        <exclude-mapping path="/member/loginForm"/>
        <exclude-mapping path="/member/login"/>
        <exclude-mapping path="/member/logout"/>
        <exclude-mapping path="/member/modify"/>
        <exclude-mapping path="/member/remove"/>
        <beans:bean class="com.bs.lec21.member.MemberLoginInterceptor"/>
    </interceptor>
</interceptors>

만약 지정해 줄 경로보다 제외시킬 URL을 선택하는게 더 빠르다면, 모든 경로(/**)에 인터셉터 적용 후 제외할 URL을 지정해주는 방법도 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함