Как исключить фильтр sitemesh при разрешении ошибки весной?
У меня есть фильтр Sitemesh, который будет украшать страницы. Я настроил весну exceptionResolver
так что все ошибки перейдут к представлению под названием error
который затем указывает на WEB-INF/jsp/error.jsp
через InternalResourceViewResolver
,
Теперь страница с ошибкой оформлена сайтом Sitemesh, и я бы хотел исключить ее из оформления. С помощью <exclude>
тег sitemesh decorator.xml
не работает. Потому что входящий URL может быть таким же нормальным, как /app/login.html
а сайтеш уже поймал и украсил.
Я замечаю, что весной, если у меня есть @ResponseBody
для запроса AJAX, он будет проходить мимо украшения Ситемеша. Интересно, как это работает? Могу ли я сделать что-то в errorResolver
обойти сайтмешь тоже?
2 ответа
Это может быть сделано путем реализации собственного exceptionResolver
, потокового вывода вручную и вернуть ноль ModelAndView
public class MyExceptionResolver extends SimpleMappingExceptionResolver{
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
//other things like logging...
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/error.jsp");
try {
dispatcher.forward(request, response);
response.getOutputStream().flush();
} catch (ServletException e) {
log.error(e);
} catch (IOException e) {
log.error(e);
}
return null;
}
По крайней мере, в SiteMesh 3 этот тип исключаемых работ (sitemesh3.xml)
<sitemesh>
<mime-type>text/html</mime-type>
<mapping path="/*" decorator="/WEB-INF/sitemesh/decorator.jsp" />
<mapping path="/app/login.html" exclude="true"/>
</sitemesh>
Это попробовали весной 3. Надеюсь, это помогло вам.