javaweb报异常一般是返回状态码500,那如何去返回200呢?
比如我像返回{code:-1,msg:"系统异常"},用springmvc的异常处理器是返回状态码是500.我想返回200
对于http请求来说,答案就是使用HttpServletResponse.setStatus(200);
我们试一下:
1.在springmvc的统一异常处理器里HandlerExceptionResolver里set一下
发现没有用.最终返回浏览器还是500
打印一下,发现就是状态码就是200啊.怎么浏览器里接到的是500呢?
2.在springmvc的拦截器里的handlerIntegerceptor里的after方法里面
打印一下,发现还是200,set一下,发现没有用.
3.在filter里试试
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse res =(HttpServletResponse) response;
chain.doFilter(request, res);
System.out.println(res.getStatus());
}
结果,如果报了异常,则根本不打印.且浏览器那里还是500,
那就try一下
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse res =(HttpServletResponse) response;
try {
chain.doFilter(request, res);
} catch (Exception e) {
System.out.println("状态码:"+res.getStatus());
}
}
发现打印的还是200.但是浏览器那里变了,变成了200
推测异常最终抛到tomcat里,tomcat发现如果有异常且返回码是200,则设置返回码是500(如果爆了异常,设置了其他异常返回码,比如是404,那么Tomcat并不会去修改返回码,好像他只针对200是吗?).所以只要爆了异常在内部设置200是没有用的.因为最终tomcat还是会set500的.所以用过滤器try掉异常,那么200就会返回200.否则200就会返回500
4.过滤器是个好方法.但也可以这样做.
在HandlerExceptionResolver进行转发到正常的@Requestmapping映射里,这时候就是返回码200了.因为那个异常已经不会上抛了.
比如:request.getRequestDispatcher("/ex").forward(request, response);那么异常就会就去/ex里了.在里面处理一些东西.
但这个要注意,如果ex里由于操作不当,也抛了异常,那就会循环调用,最终导致栈溢出.解决办法.设置request.setAttrbute(fist),判断是首次进入异常处理器,如果是首次进入,那么就转发过去,如果不是首次,那么就不转发或者其他.