2013-08-23 41 views
4

我在想方設法避免必須從所有攔截器中排除靜態內容,而不必爲每個應忽略這些攔截器的攔截器指定exclude-mapping標記。我的context.xml的部分如下:Spring MVC - 從所有攔截器中排除資產

<mvc:resources mapping="/assets/**" location="/assets/"/> 

<mvc:interceptors> 

    <bean class="com.myapp.security.interceptor.SecurityInterceptor" /> 

    <mvc:interceptor> 
     <mvc:mapping path="/**" /> 
     <mvc:exclude-mapping path="/assets/**" /> 
     <bean class="com.myapp.interceptor.MessageInterceptor" /> 
    </mvc:interceptor> 

</mvc:interceptors> 

正如你所看到的,我已經被排除在MessageInterceptor指定/assets/。不過,我也希望SecurityInterceptor也排除資源。繼DRY之後,爲每個攔截器指定一個exclude-mapping似乎是不合理的(因爲不應該有真正的理由來攔截資源)。

我四處搜索,找不到任何解決方案。任何幫助表示讚賞!

感謝

回答

4

我竭力想任何方法來實現你的配置想要的東西。也許別人可以提供解決方案。

快速代碼解決方案這將實現你想會是這樣的:

public abstract class ResourceExcludingHandlerInterceptor implements HandlerInterceptor 
{ 

    @Override 
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception 
    { 
      if (!isResourceHandler(handler)) 
      { 
      doAfterCompletion(request, response, handler, ex); 
      } 
    } 

    public abstract void doAfterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; 

    public abstract void doPostHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; 

    public abstract boolean doPreHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; 

    /** 
    * <p> 
     * Determine if the request is about to be handled by a mapping configured 
    * by <mvc:resources> 
    * </p> 
    * 
    * @param handler 
    *   - the handler to inspect 
    * @return - true if this is a <mvc:resources> mapped request, false 
    *   otherwise 
    */ 
    private boolean isResourceHandler(Object handler) 
    { 
     return handler instanceof ResourceHttpRequestHandler; 
    } 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception 
    { 
     if (!isResourceHandler(handler)) 
     { 
      doPostHandle(request, response, handler, modelAndView); 
     } 
    } 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception 
    { 
     return isResourceHandler(handler) ? true : doPreHandle(request, response, handler); 
    } 
} 

然後,您可以有你的HandlerInterceptor實現擴展這個抽象類。因爲< mvc:資源>基本上是註冊ResourceHttpRequestHandler實例的一種簡短方式,這可以確保您的HandlerInterceptor實現簡單地忽略映射爲由一個處理的任何請求。

+0

謝謝你的迴應。我擔心我可能不得不做類似的事情。如果沒有人提出更好的解決方案,我會將其標記爲正確。 – Mike