当在filter中出现系统异常时,如何定制化返回数据(比如返回给客户端json数据)

当在filter中出现系统异常时,如何定制化返回数据(比如返回给客户端json数据)

需求描述: 一般的情况下Spring中的@ExceptionHandler注解用于统一处理在Controller层抛出的异常。二通常情况下在项目中会使用到很多个第三方的框架,例如Spring,Struts等,有些框架需要配置其过滤器到项目中,当在过滤器中出现异常时,返回给调用端(可以是node,也可以是基于HttpClient的客户端)的信息不易阅读,通常情况下是类似“Server Internal Error”这样的信息,为了友好提示客户端,我们可以定制化此异常信息。具体思路为:在配置的第三方框架的过滤器之前配置一个自定义的过滤器,在这个自定义的过滤器中catch住filterChain.doFilter(request, response);方法,从而在捕获块中定制自定义异常信息,并返回给客户端

  1. 下面是一个自定义的过滤器在web的配置,注意此过滤器一定要配置在其他的过滤器之前
    <filter>
        <filter-name>exceptionHandlerFilter</filter-name>
        <filter-class>com.wusong.client1.filter.ExceptionHandlerFilter</filter-class>
    </filter>


    <filter-mapping>
        <filter-name>exceptionHandlerFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 第三方框架的其他过滤器在这里配置 -->
  1. 自定义过滤器,实例代码如下:
public class ExceptionHandlerFilter extends OncePerRequestFilter {

    @Override
    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        try {
            filterChain.doFilter(request, response);
        } catch (Exception e) {

            // 自定义异常的类,用户返回给客户端相应的JSON格式的信息
            FailureResponse errorResponse = new FailureResponse("ST无效");

            response.setContentType("application/json; charset=utf-8");
            response.setCharacterEncoding("UTF-8");

            String userJson = convertObjectToJson(errorResponse);
            OutputStream out = response.getOutputStream();
            out.write(userJson.getBytes("UTF-8"));
            out.flush();
        }
    }

    public String convertObjectToJson(Object object) throws JsonProcessingException {
        if (object == null) {
            return null;
        }
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(object);
    }
}

猜你喜欢

转载自blog.csdn.net/LOVE____JAVA/article/details/80105502