날아라쩡글이의 블로그입니다.

inteceptor로 로그인 처리하기 본문

중앙 HTA (2106기) story/spring java framwork story

inteceptor로 로그인 처리하기

날아라쩡글이 2022. 1. 11. 11:06
반응형

요청파라미터의 경우 폼입력값을 담는다. 
그러나 @LoginUser는 요청파라미터가 새로 만든게 아니고, 원래 있던것을 사용할 것이기 때문에 어노테이션@LoginUser로 생성한다. 

argument로 만드는 것은 힘들지만, 한번 만들어두면 편하다는 장점이 존재한다. 

인터셉터 만들기 
인터셉터란 컨트롤러의 요청 핸들러 메소드 실행 전처리/후처리를 구현하는 객체이다.

  • interceptor을 담을 패키지를 설정한다. 
  • 클래스를 생성한다. 
    • LoginCheckInterceptor으로 설정한다.
    • HandlerInterCeptor를 상속받는다. 
    • 그리고 메소드 재정의를 진행하는데, default값으로 되어있기 때문에 강제적으로 나오지 않는다 
    • preHandler, postHandler , afterHandler의 메소드를 재정의해준다. 
      • boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        •  컨트롤러의 요청핸들러 메소드 실행전 실행되는 메소드다.
        • 이 메소드가 true를 반환하면 요청 핸들러 메소드를 실행하고, false를 반환하면 요청핸들러 메소드를 실행하지 않는다. 
          • HandlerMethod handlerMethod = (HandlerMethod) handler;
            MethodParameter[] methodParameters = handlerMethod.getMethodParameters();

            boolean hasLogineUser = false;
            for (MethodParameter methodParameter : methodParameters) {
            if (methodParameter.hasParameterAnnotation(LoginedUser.class)) {
            hasLogineUser = true;
            break;
            }
            }
            logger.info("로그인 체크 여부: " + hasLogineUser);

            if (!hasLogineUser) {
            return true;
            }

            User user = (User) SessionUtils.getAttribute("LOGIN_USER");
            if (user == null) {
            response.sendRedirect("/error/login/form.do");
            return false;
            }

            return true;

            }
      •  void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, //post =현재
         ModelAndView modelAndView)
        • 컨트롤러의 요청핸들러 메소드 실행후 실행되는 메소드다.
      •  void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        • 클라이언트의 요청을 처리하고, DispatcherServlet에서 응답을 보낸 후 실행되는 메소드다.
    • preHandler를 많이 사용하게 되는데, 로그인의 유무를 확인 할 수 있게 된다. 
    • context-web.xml에 알려준다. 
      • mvc:interceptor안에 
      • mvc:interceptor를 작성하고 
      • mvc:mapptin을 작성하고 
      • bean class로 url를 작성하여 등록을 해준다. 
      • <mvc:interceptors>
        <mvc:interceptor>
        <mvc:mapping path="/**/*.do"/>
        <mvc:exclude-mapping path="/rest/**/*.do"/>
        <bean class="com.sample.interceptor.LoginCheckInterceptor"></bean>
        </mvc:interceptor>
        </mvc:interceptors>
      • ajax요청에 대한 로그인 체크를 담당하는 인터셉터를 등록할 수 있다. 
      • <mvc:interceptor>
        <mvc:mapping path="/rest/**/*.do"/>
        <bean class="com.sample.interceptor.RestLoginCheckInterceptor"></bean>
        </mvc:interceptor>

default메소드 

  • 인터페이스에 구현메소드를 추가할 때 사용되는 키워드이다. 
  • 자바 8버젼부터 인터페이스에 구현메소드를 추가할 수 있게 되었다. 
  • 인터페이스에 추가된 구현메소드는 해당 인터페이스를 구현한 모든 하위 클래스에 상속된다. 
  • 개발자 레벨에서 인터페이스에 default메소드를 정의하는 경우는 흔하지 않다. 
  • default메소드의 도입배경
    • Collercion<E> 콜렉션 프레임워크로 도입이 되고, stream API를 추가하면서 default메소드가 도입되었다. 
    • 자바의 모든 자료구조구현 클래스는 Collection인터페이스의 하위클래스이다. 
      • collection은 표준 인터페이스다. 
    • collection인터페이스에 stream<T> stream()메소드를 추가해서 자바의 모든자료구조 구현클래스가 stream()메소드를 추가하는 것은 변경할 클래스가 너무많아지는 문제가 있다. 
    • 위의 문제를 해결하기 위해서 도입된 것이 default메소드이다. 
    • 인터페이스에서 구현메소드를 정의할 수 있도록 지원하는 키워드가 default이다. 
    • 따라서, collection인터페이스에 default키워드로 stream<T>를 반환하는 stream()메소드를 구현하면 collection 인터페이스의 하위구현클래스들은 stream메소드를 구현할 필요가 없어진다. 
    • ArrayList, hashSet, vactor, stack, Queue 처럼 존재하는 자료구조의 구현클래스의 소스코드를 전부 변경하는 것은 부담스러운 일로 interface에서는 구현, 메소드정의를 default에서는 될 수 있게 규약을 변경한 것이다.
    • interface에서 구현가능하도록, default메소드를 도입하게 되었다. 
  • default키워드의 활용
    • 인터페이스가 여러개의 추상메소드를 가지고 있고, 거의 대부분의 구현 클래스가 그중에서 하나만 재정의해서 사용했다. 
    • 예전에는 인터페이스가 메소드를 구현했으면 추상클래스로 Adapter를 붙여서 상속받고, 필요한 부분만 구현을 진행하였다 그러나 이제는 필요한 것만 뽑아서 수행문을 작성하게 되었다. 
    • default를 붙이면 원하는 것만 재정의가 가능하다. 

@interceptor로는 클라이언트 요청전을 실행한다. 
@argumentResolver로는 실행여부가 원하는 매개변수의 값으로 전달될 수 있다. 

인터셉터를 사용해서 HandlerAdapter에서 Controller전,후로 사용될 수 있다. 

컨트롤러에서 Exception을 발생한다. 
핸들러 메소드가 실행되고, 
json의 응답 혹은 로그인폼화면과 에러메세지가 전달될 수 있다. 

반응형
Comments