[Spring] 스프링 리다이렉트, 인터셉터(Spring Redirect, Interceptor)

2021. 1. 14. 03:24 Spring Framework/Spring 입문 - 개념 및 핵심

| 스프링 리다이렉트(Spring Redirect)

 

리다이렉트(Redirect)는 사용자가 웹 서버의 자원을 요청했을 때 현재 URL 자원(HTML이나 Img 등)을 반환하는 것이 아닌 다른 자원을 받도록 다른 URL로 유도하는 것을 말한다.

 

아래는 /removeForm 으로 들어온 사용자 요청으로 사용자 정보를 삭제하는 일을 하는 컨트롤러 메서드다. 만약 정상적인 경로(회원인증이 된 후의 사이트)로 /removeForm이 들어올 경우 해당 코드를 실행하면 되지만 그렇지 않을 경우(회원 인증도 안 된 상태)에는 이 코드를 실행하지 않거나 다른 곳으로 리다이렉트해야한다

 

 

이 때, ModelAndView 객체에 setViewName에 리다이렉트 URL을 넣어 해당 URL로 사용자 페이지가 유도되도록 할 수 있다.

@RequestMapping("/removeForm")
public ModelAndView removeForm(HttpServletRequest request) {

        ModelAndView mav = new ModelAndView();

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

        if(member == null) {
        mav.setViewName("redirect:/");
        } else {
        mav.addObject("member", member);
        mav.setViewName("/member/removeForm");
        }

        return mav;
}

 

| 스프링 인터셉터(Spring Interceptor)

 

스프링 인터셉터(Spring Interceptor)는 스프링의 컨트롤러에서 메서드를 호출하기 전과 후 그리고 JSP의 뷰 처리가 끝날 경우 웹 로직 사이에 실행하는 로직을 말한다. 리다이렉트를 사용해야하는 많은 경우에 인터셉터를 이용하여 직접 리다이렉트 코드를 집어 넣을 필요없이 쉽게 리다이렉트를 구현할 수 있게 해준다.

 

스프링 인터셉터는 HandlerInterceptor라는 인터페이스를 구현하여 만들 수 있고 preHandle, postHandle, afterCompletion 이 3가지가 주로 쓰인다.

 

아래는 인터셉트가 동작하는 과정이다.

 

 

 

위 로직흐름을 보고 HandlerInterceptor를 구현한 HandlerInterceptorAdapter를 상속받아 아래와 같은 인터셉터를 만들었다. preHandle메서드는 Handler가 컨트롤러의 메서드를 실행하기 전 실행되며 이때 만일 원하지 않는 경로로 사용자가 요청했을 경우 response.sendRedirect 를 이용하여 리다이렉트 경로를 보낸다. 이 때 false 불린값을 리턴하여 Handler가 컨트롤러의 메서드를 찾아 실행하기 전에 수행동작을 하지 않게 막고 단순히 리다이렉트 경로를 보낸다.

 

만약 제대로된 경로를 타고 사용자 요청사항이 왔을 경우 true를 리턴하여 Handler가 알맞은 컨트롤러의 메서드를 실행하게 한다.

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() + "/");
        return false;
    }

    @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);
    }
}



출처: https://engkimbs.tistory.com/697?category=767795 [새로비]