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