Interceptor_개념
Interceptor
: 가로채다
(필터도 서블릿에서 가로채서 사용했다.)
클라이언트 ->필터 -> 서블릿->필터->클라이언트
스프링에서는 Dispatcher서블릿 사용햇다.
필터는 스프링안에까지 들어오지 못하고 밖에서 애플리케이션에서 가능하다.
interceptor는 Dispather 뒤에 존재한다.
AOP도 요청을 가로채는 기능이다.
AOP는 공통된 기능을 원하는 시점에 집어 넣게하는 기능을 한다.
(log, 트랜잭션, 암호화 등등)에 많이 사용
interceptor(로그인처리)스프링 안에 있다. servlet-context 인지시켜줘야한다.-->servlet-context는 .do만 처리해주기 때문에 홈에 들어갈 때만 처리한다
-->그래서 home.do에만 콘솔에 찍힌다 + board-context, member-context에도 똑같은 코드를 추가해준다
preHandle()
: DispacharServlet이 Controller를 호출하기 전에 수행
postHandle()
: Controller에서 DispacharServlet으로 리턴되는 순간에 수행
afterCompletion()
: 최종 결과를 생성하는 일을 포함한 모든 작업이 완료된 후(뷰까지 다 진행이 됬을 때)
오버라이딩의 조건은 절대로 바꾸면 안된다.
preHandle의 반환은 무조건 true
BoardEnterInterceptor만들기
로그인을 하지 않은 상태로 게시글 리스트보기를 요청하게 되면
"로그인 후 이용하세요"하는 경고메세지와 메인화면으로 redirect하기
1) BoardEnterInterceptor class
public class BoardEnterInterceptor implements HandlerInterceptor{
private Logger logger = LoggerFactory.getLogger(BoardEnterInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception{
HttpSession session = request.getSession();
Member loginUser = (Member)request.getAttribute("loginUser");
if(loginUser == null) {
session.setAttribute("msg", "로그인 후 이용하세요");
response.sendRedirect("home.do");
return false;
}
logger.debug("로그인 후 이용하세요");
logger.debug(request.getRequestURI());
return HandlerInterceptor.super.preHandle(request, response, handler);
}
}
2) board-context.xml
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/blist.bo"/>
<bean id="BoardEnterInterceptor" class="com.ioi.spring.common.interceptor.BoardEnterInterceptor"/>
</mvc:interceptor>
</mvc>
3) home.jsp
<script>
$(function(){
var msg = '${msg}';
if(mag != ''){
alert(msg);
}
});
</script>
<%@ page session="false"%> -->기존에 세션 무료화를 풀어준다.
로그인 하지않은 상태로 게시물을 보려고 할 때 function이 실행된다! --> 1번의 BoardEnterInterceptor에서
if문을 이용해서 loginUser ==null의 조건을 통해 문구가 출력된다.