블로그 이미지
Max.

calendar

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        

Notice

'HandlerInterceptorAdapter'에 해당되는 글 1

  1. 2007.08.28 HandlerInterceptorAdapter 구현체에서는 가급적 sendRedirect 를 쓰지 말자.(2)
2007.08.28 08:43 이전글(~2009)
삽질의 추억

보통 Spring MVC에서 요청 URL을 interceptor할때 HandlerInterceptorAdapter 를 구현 확장하게 된다.인터셉터하는 목적에 따라 다르겠지만, 어떤 인증값을 확인할때는 인증값이 없으면 Exception을 던지는 경우와 특정 페이지로 redirect하는 경우가 있다.
그러나 특별한 경우에 예상치 못한 오류를 발생했다.

그 경우는 이렇다. ( SiteMesh + DWR + SpringMVC + HandlerInterceptorAdapter  )
[action-xxx.xml]
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
           <property name="interceptors">
          <list>
              <ref bean="frontSecurityInterceptor" />
            ....
          </list>
        </property>   
        <property name="mappings">
            <props>
                <prop key="/**/**/**/post_list.do">postController</prop>
                <prop key="/**/**/**/post_view.do">postController</prop>
                  .....
            </props>
        </property>
    </bean>
[DWR]
    <bean id="frontFacade" class="xxx.facade.FrontFacadeImpl">
    <property name="postService" ref="postService"></property>
        ........   
        <dwr:remote javascript="AjaxFrontFacade">   
        <dwr:include method="getFronts" />     
        ........
        </dwr:remote>  
    </bean>
[interceptor]
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object controller) throws Exception {
        .......
        if(result == false) response.sendRedirect("XXXX");
       or
        if(result == false) throw new IdCheckedException(errorMessage);
       ......
    }


SiteMesh 사용시 Exception 발생시 각 Exception 마다 따로 처리해야 한다. 좀더 정교하게 Exception처리를 할수 있겠으나 실상은 귀찮이즘이 발동한다. 그보다 더 유혹적인것은 redirect 이다. 특정 페이지로 무조건 돌려버리니까 편하다. SiteMesh 적용하기도 좀더 편하다. SiteMesh 는  url 베이스이기에 특정 오류페이지를 보이기가 여간 까다롭지 않다.

예를 들면 /board/list.do 를 요청했을대 오류페이지를 SiteMesh 에서 특정 layout으로 보일려면? 설정이 복잡해 진다. 그러나 어떤 오류가 나왔을때 특정 페이지리 rediect 하면 일정한 포멧의  layout 을 보여주는것은 어렵지 않다.(그것이 SiteMesh 의 장점이니까)
따라서 SiteMesh 로 Layout 을 쓴다면 Exception처리보다는 redirect 가 더 매력적으로 보인다.

그런데 그 Layout에 DWR를 이용한 Ajax를 구현하고, 해당 url를 Interceptor 한다면 문제가 발생한다. Interceptor 에서 rediect를 사용해버렸으므로 더이상 SiteMesh 에서 request,response 를 사용할수없는 모양이다.(Sitemesh 는  filter이므로 내부적으로 request,response를 사용할것이다.)

결국 다시 Exception으로 돌아가야 했고, 각 Exception마다 다른 페이지와 매핑해야만 했다. 좀더 편해지고자 꼼수를 쓸려다 삽질만한 결과를 낳았다.

신고
posted by Max.
prev 1 next