날아라쩡글이의 블로그입니다.
inteceptor로 로그인 처리하기 본문
728x90
반응형
요청파라미터의 경우 폼입력값을 담는다.
그러나 @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;
}
- HandlerMethod handlerMethod = (HandlerMethod) handler;
- void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, //post =현재
ModelAndView modelAndView)- 컨트롤러의 요청핸들러 메소드 실행후 실행되는 메소드다.
- void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
- 클라이언트의 요청을 처리하고, DispatcherServlet에서 응답을 보낸 후 실행되는 메소드다.
- boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
- 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의 응답 혹은 로그인폼화면과 에러메세지가 전달될 수 있다.
반응형
'중앙 HTA (2106기) story > spring java framwork story' 카테고리의 다른 글
AOP(Aspect Oriented Programming) (0) | 2022.01.11 |
---|---|
트랜잭션 @transactional (0) | 2022.01.11 |
@어노테이션만들기 ArgumentResolve (0) | 2022.01.10 |
webapp/resource/images에 파일 올리기 (0) | 2022.01.07 |
RestController , 정형화된 응답 (0) | 2022.01.07 |
Comments