Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring MVC-从所有拦截器中排除资产_Spring_Spring Mvc - Fatal编程技术网

Spring MVC-从所有拦截器中排除资产

Spring MVC-从所有拦截器中排除资产,spring,spring-mvc,Spring,Spring Mvc,我试图找出一种方法,避免从所有拦截器中排除静态内容,而不是为每个应该忽略这些内容的拦截器指定一个exclude-mapping标记。my context.xml的部分内容如下: <mvc:resources mapping="/assets/**" location="/assets/"/> <mvc:interceptors> <bean class="com.myapp.security.interceptor.SecurityInterceptor

我试图找出一种方法,避免从所有拦截器中排除静态内容,而不是为每个应该忽略这些内容的拦截器指定一个
exclude-mapping
标记。my context.xml的部分内容如下:

<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之后,必须为每个拦截器指定一个
排除映射
(因为不应该真正有理由拦截资源),这似乎是不合理的

我四处寻找,找不到任何解决办法。感谢您的帮助


谢谢

我正在努力想办法在配置中实现您想要的功能。也许其他人可以提供一个解决方案

实现您所需的快速代码解决方案如下:

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);
     }
 }
公共抽象类ResourceExcludingHandlerInterceptor实现HandlerInterceptor
{
@凌驾
公共void afterCompletion(HttpServletRequest请求、HttpServletResponse响应、对象处理程序、异常ex)引发异常
{
如果(!isResourceHandler(handler))
{
doAfterCompletion(请求、响应、处理程序、ex);
}
}
公共抽象void doAfterCompletion(HttpServletRequest请求、HttpServletResponse响应、对象处理程序、异常ex)抛出异常;
公共抽象void doPostHandle(HttpServletRequest请求、HttpServletResponse响应、对象处理程序、ModelAndView ModelAndView)引发异常;
公共抽象布尔doPreHandle(HttpServletRequest请求、HttpServletResponse响应、对象处理程序)抛出异常;
/**
*
*确定请求是否将由配置的映射处理
*借
*

* *@param处理程序 *-要检查的处理程序 *@return-true如果这是映射请求,则为false *否则 */ 私有布尔isResourceHandler(对象处理程序) { 返回ResourceHttpRequestHandler的处理程序实例; } @凌驾 public void postHandle(HttpServletRequest请求、HttpServletResponse响应、对象处理程序、ModelAndView ModelAndView)引发异常 { 如果(!isResourceHandler(handler)) { doPostHandle(请求、响应、处理程序、模型和视图); } } @凌驾 公共布尔预处理(HttpServletRequest请求、HttpServletResponse响应、对象处理程序)引发异常 { 返回isResourceHandler(处理程序)?true:doPreHandle(请求、响应、处理程序); } }

然后,您可以让HandlerInterceptor实现扩展这个抽象类。这基本上是注册ResourceHttpRequestHandler实例的一种简捷方法,这将确保HandlerInterceptor实现只需忽略映射为由一个实例处理的任何请求。

感谢您的响应。我担心我可能不得不做类似的事情。如果没有人提出更好的解决方案,我会将其标记为正确。