美文网首页框架学习
Spring中处理Filter中的异常

Spring中处理Filter中的异常

作者: maxwellyue | 来源:发表于2017-07-02 00:07 被阅读3560次

通常的Spring全局异常处理并不能处理Filter中的异常。

Filters happens before controllers are even resolved 
so exceptions thrown from filters can't be caught by a Controller Advice.
Filters are a part of the servlet and not really the MVC stack.

How to manage exceptions thrown in filters in Spring?中有不同的解答版本。

我采取的解决办法是:在web.xml中配置error页面:

<error-page>
        <error-code>500</error-code>
        <location>/500</location>
    </error-page>
//或者,两种方式都可以
<error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/500</location>
</error-page>

然后,创建专门处理错误的Controller:

@Controller
public class ErrorController {

    @RequestMapping("/404")
    public void unmappedRequest(HttpServletRequest request, HttpServletResponse response) {
        String uri = request.getRequestURI();
        response.setStatus(HttpServletResponse.SC_OK);
        throw new UnknownResourceException("你确定接口地址写对了?我还没写这个接口呢");
    }

    @RequestMapping("/500")
    public void handlerFilterError(HttpServletRequest request) {
        Throwable t = (Throwable) request.getAttribute("javax.servlet.error.exception");
        throw new SystemException(t.getMessage());
    }

}

之后,就可以在全局处理异常地方处理了,并且异常信息不回丢失。
我这里采用的是@ControllerAdvice的方式进行的全局异常处理。

@ControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    .....

    .....
    /**
     * 处理系统异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(SystemException.class)
    @ResponseBody
    JSONObject handleSystemException(SystemException e) {
        logger.error(e.getMessage(), e);
        return Result.fail("系统异常:" + e.getMessage());
    }

    .......      
}

相关文章

网友评论

    本文标题:Spring中处理Filter中的异常

    本文链接:https://www.haomeiwen.com/subject/upzgcxtx.html