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实现只需忽略映射为由一个实例处理的任何请求。感谢您的响应。我担心我可能不得不做类似的事情。如果没有人提出更好的解决方案,我会将其标记为正确。