当在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);
    }
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值