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),判斷是首次進入異常處理器,如果是首次進入,那麼就轉發過去,如果不是首次,那麼就不轉發或者其他.